java 8 学习一(概述)
学习java8的新特性之前,简单看了下从java5开始历代版本的新特性,都是别人总结的。
java5、java6、java7、java8的新特性
http://blog.csdn.net/samjustin1/article/details/52268004
其中java 7 第四点介绍System.getJavaIoTempDir()....这些方法已经没有了,用System.getProperties()可以达到同样的目的。
比如System.getUserDir() 可用System.getProperties(“user.dir”)代替。
Map map = {name:“xxx”,age:18};//不可行
作者是个复制粘贴党,估计都没试这些特性是否真添加了。
Java8新特性
http://www.cnblogs.com/chengJAVA/p/6113649.html
1.函数式接口
这里有个坑--哪怕有很多默认方法,只要接口只定义了一个抽象方法,它就仍然是一个函数式接口。
2.Lambda表达式
3.增强接口(和抽象类很像)
4.stream流的操作(和scala类似)
5.IO/NIO的改进新增的API
6.国际化(这个针对世界时区的),date类的新API (下面几个实例)
LocalDate.now();//获取localdate
LocalDate.now().plusDays(-1L).atStartOfDay();//前一天凌晨0点
LocalDate.now().atTime(LocalTime.NOON);//今天中午12点
LocalDate.now().atTime(OffsetTime.now().plusHours(-1));//今天前一小时
LocalDate.now().atTime(8, 30);//设置时间
LocalDate.now().atTime(8, 30).toLocalDate();//提取日期
LocalDate.now().atTime(8, 30).toLocalTime();//提取时间
LocalDate.parse("2020-10-01");//解析字符串时间
LocalDate.parse("20201005",DateTimeFormatter.ofPattern("yyyyMMdd"));//解析字符串时间
Instant.now().toEpochMilli();//获取当前时间戳
System.out.println(Clock.systemUTC());//格林尼治时区
System.out.println(Clock.systemDefaultZone());//默认时区
System.out.println(Clock.systemDefaultZone().getZone());//获取当前时区
System.out.println(Clock.systemDefaultZone().millis());//时间戳
之前处理时间都是用SimpleDateFormat和Calendar类来回转换,现在方便多了。
并行与共享的可变数据,这两个要点(没有共享的可变数据,将方法和函数即代码传递给其他方法的能力)是我们平常所说的函数式编程范式的基石
值是Java中的一等公民 ----可传递
其他很多Java概念(如方法和类等)则是二等公民 ----编程语言中的其他结构也许有助于我们表示值的结构,但在程序执行期间不能传递,因而是二等公民。
Java 8的方法引用 ??
与用对象引用传递对象类似(对象引用是用new创建的),在Java 8里写下File::isHidden的时候,你就创建了一个方法引用,你同样可以传递它。

谓词 (predicate)
在数学上常常用来代表一个类似函数的东西,它接受一个参数值,并返回true或false。即一个返回boolean值的函数
从传递方法到 Lambda
1.方法引用---要用它的话,你可以写:
filterApples(inventory, Apple::isGreenApple);
但是用前要定义isGreenApple方法
public static boolean isGreenApple(Apple apple) {
return "green".equals(apple.getColor());
}
2.把方法作为值来传递显然很有用,但要是为类似于isHeavyApple和isGreenApple这种可能只用一两次的短方法写一堆定义有点儿烦人。
所以引入了一套新记法(匿名函数或Lambda)
可以这样写
filterApples(inventory, (Apple a) -> "green".equals(a.getColor()) );
也可以这样
filterApples(inventory, (Apple a) -> a.getWeight() > 150 );
还可以这样
filterApples(inventory, (Apple a) -> a.getWeight() < 80 ||"brown".equals(a.getColor()) );
二、为了更好地利用并行,Java 8中有一整套新的类集合API——Stream
1.api
2.Collections和Streams之间做转换
内部迭代与外部迭代
和Collection API相比,Stream API处理数据的方式非常不同。用集合的话,你得自己去做迭代的过程。你得用for-each循环一个个去迭代元素,然后再处理元素。我们把这种数据迭代的方法称为外部迭代。
相反,有了Stream API,你根本用不着操心循环的事情。数据处理完全是在库内部进行的。我们把这种思想叫作内部迭代。
并行(多线程)共享变量

Stream API如何解决这个问题的?
Java 8也用Stream API(java.util.stream)解决了这两个问题:集合处理时的套路和晦涩,以及难以利用多核。
(1)在两个CPU上筛选列表,可以让一个CPU处理列表的前一半,第二个CPU处理后一半,这称为分支步骤。
(2) CPU随后对各自的半个列表做筛选。
(3)最后一个CPU会把两个结果合并起来 -----整体思想和mapReduce类似,分片处理再聚合
对比旧的集合Collection和"新集合"Stream
Collection主要是为了存储和访问数据,而Stream则主要用于描述对数据的计算。
作者建议 --筛选一个Collection(将上一节的filterApples应用在一个List上)的最快方法常常是将其转换为Stream,进行并行处理,然后再转换回List。
List<Apple> heavyApples =
inventory.stream().filter((Apple a) -> a.getWeight() > 150) //并行则使用parallelStream() 这个方法,stream()是串行运行
.collect(toList()); //把普通集合处理为Stream,计算完毕后再转为普通集合。
默认方法的引出
若要使用上面的代码.stream()方法。在Java 8之前, List<T>并没有stream或parallelStream方法,它实现的Collection<T>接口也没有,因为当初还没有想到这些方法嘛!可没有这些方法,这些代码就不能编译。换作你自己的接口的话,最简单的解决方案就是让Java 8的设计者把stream方法加入Collection接口,并加入ArrayList类的实现。 但是接口改变,之前的项目工程里所有的类都要去实现这个接口的新方法。
这下你就进退两难了:你如何改变已发布的接口而不破坏已有的实现呢?
这就给接口设计者提供了一个扩充接口的方式,而不会破坏现有的代码。 Java 8在接口声明中使用新的default关键字来表示这一点。(牛逼!)
在Java 8里,你现在可以直接对List调用sort方法。它是用Java 8 List接口中如下所示的默认方法实现的,它会调用Collections.sort静态方法:
default void sort(Comparator<? super E> c) {
Collections.sort(this, c);
}
这意味着List的任何实体类都不需要显式实现sort,而在以前的Java版本中,除非提供了sort的实现,否则这些实体类在重新编译时都会失败。
- 如果在好几个接口里有多个默认实现,是否意味着Java中有了某种形式的多重继承?
- Optional<T>
- 模式匹配
理解行为参数化和传递代码的"演化方式"
java8前怎么做?用匿名内部类怎么实现?方法引用?再到Lambda表达式。
java 8 学习一(概述)的更多相关文章
- Java IO学习--(一)概述
在这一小节,我会试着给出Java IO(java.io)包下所有类的概述.更具体地说,我会根据类的用途对类进行分组.这个分组将会使你在未来的工作中,进行类的用途判定时,或者是为某个特定用途选择类时变得 ...
- Java基础学习-泛型概述和测试
1.举例 首先先用集合来写个自定义对象存储并且去遍历. package genericity; import java.util.ArrayList; import java.util.Collect ...
- Java基础学习-接口-概述以及成员特点
package interfaceclass; /*接口的概述: * 接口解决的问题: * 因为java中的继承的单一局限性(子类只能继承一个父类),为了打破这个局限,java语言提供了一个机制,接口 ...
- Java 集合学习--集合概述
一.集合框架 集合,通常也叫容器,java中有多种方式保存对象,集合是java保存对象(对象的引用)的方式之一,之前学习的数组是保存对象的最有效的方式,但是数组却存在一个缺陷,数组的大小是固定的,但是 ...
- Java基础学习_01 概述及环境配置
一.概述 1.Java语言平台版本 1.1J2SE(Java 2 Platform Standard Edition)标准版 为开发普通桌面和商务应用程序提供的解决方案,该技术体系是其他两者的基础,可 ...
- 一,java框架学习
一,java框架学习 Hibernate概述Hibernate是一个开放源代码的ORM(对象关系映射)框架,对jdbc进行了轻量级的封装,是的java开发人员可以使用面向对象编程思想操作数据库,简化操 ...
- Java NIO 学习笔记(一)----概述,Channel/Buffer
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- java核心技术学习笔记之一程序设计概述
Java 核心技术之一程序设计概述 一. Java语言的特点 简单行 :取经于C++,排除了C++不常用的指针.结构等,增加垃圾回收. 面向对象:与C++不同是单继承,但是可以继承多接口.完全面向 ...
- Java多线程学习(转载)
Java多线程学习(转载) 时间:2015-03-14 13:53:14 阅读:137413 评论:4 收藏:3 [点我收藏+] 转载 :http://blog ...
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- 面试官:”准备用HashMap存1w条数据,构造时传10000会触发扩容吗?“
通常在初始化 HashMap 时,初始容量都是根据业务来的,而不会是一个固定值,为此我们需要有一个特殊处理的方式,就是将预期的初始容量,再除以 HashMap 的装载因子,默认时就是除以 0.75. ...
- CentOS7 Hbase 安装(完全分布式)
安装前准备 hadoop安装 zookeeper安装 安装步骤 1.下载 $ wget http://mirror.bit.edu.cn/apache/hbase/2.0.5/hbase-2.0.5- ...
- Python基础 — 面向对象编程基础
目录 1. 面向对象编程基础 2. 定义类和创建对象 3. init() 方法 4. 魔法方法 5. 访问可见性问题 5. 练习 1. 面向对象编程基础 把一组数据结构和处理它们的方法组成对象(obj ...
- 排列组合(包括n中随机抽取m个)
有些情况我们需要获取一个数组中的所有排列组合情况,或者获取一部分数据进行随机组合,这个在python中有一个模块可以实现.具体情况如下 :::::::::::::::::::::::::::::::: ...
- rocketmq常用命令整理
1. 启动namesrv和borker sh /opt/alibaba-rocketmq/bin/runserver.sh com.alibaba.rocketmq.namesrv.NamesrvSt ...
- Redis学习之intset整数集合源码分析
1.整数集合:整数的集合,升序排序,无重复元素 2.整数集合intset是集合键的底层实现之一,当一个集合只包含整数值的元素,并且这个集合的元素数量不多时,redis会使用整数集合作为集合键的底层实现 ...
- 2019年12月的第一个bug
现在是2019年12月1日0点27分,我的心情依旧难以平静.这个月是2019年的最后一个月,是21世纪10年代的最后一个月,也是第一批90后30岁以前的最后一个月.就是在这个月的第一天的0点0分,我写 ...
- 让你的 vs code 跑在云上,用手机浏览器就能写代码
让你的vs code 跑在云服务器上 在B站上看到一个视频Run VS Code in the browser with massive computing resources(教你如何配置一个云ID ...
- 有关 Table 获取Json 的解决方案
目录 写在前面 具体操作步骤 写在前面 在项目的开发过程中,我们使用最多的是表单的序列化.而有关以Table的序列化成Json的方法不太常见. 在做功能的时候发现,没有提交如何把Table序列化成Js ...
- Mvc中模拟模型
如题,每次研究前台技术都要建数据库.连接,还遇到VS各种版本问题,太麻烦. 写这么一个东西,模仿后台Model,上课的时候研究代码层面的内容.甚好. 数据库类: class myDatabase { ...