1.HashMap系列采用红黑树(超过一定数量)
2.更少的代码-lambda表达式
3.强大的Stream API-Stream
4.便于并行-Parallel
5.最大化减少空指针异常-Optional
1.lambda表达式:
左侧:lambda表达式的参数列表
右侧:lambda表达式中需要执行的功能,即函数体
语法:
(1)无参数,无返回值
Runnable r = () -> System.out.println("hello lambda");
r.run();
(2)有一个参数,无返回值
(x) -> System.out.print(x);
(3)只有一个参数,可以省略小括号
x -> System.out.print(x);
(4)有两个以上参数,有返回值,并且lambda体中有多条语句
Comparator<Integer> c1 = (x,y) -> {
System.out.print(Integer.compare(x,y)+"函数式接口");
return Integer.compare(x,y);
}
(5)若lambda体中只有一条语句,return和大括号都可以省略不写
Comparator<Integer> c1 = (x,y) -> return Integer.compare(x,y);
(6)lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器可以通过上下文进行类型判断推断出数据类型
(Integer x,Integer y) -> Integer.compare(x,y);
2.Stream流
(1)创建
@Test
public void test1(){
//1. 可以通过Collections系列集合提供的stream()或parallelStream()
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream();
//2. 通过Arrays中的静态方法stream()获取数组流
Employee[] emps = new Employee[10];
Stream<Employee> stream1 = Arrays.stream(emps);
//3. 通过Stream类中的静态方法of()
Stream<String> stream3 = Stream.of("", "", "");
//4. 创建无限流
//迭代
Stream.iterate(0,x -> x+2).limit(10).forEach(System.out::println);
//生成
Stream<Double> generate = Stream.generate(() -> Math.random());
generate.limit(5).forEach(System.out::println);
}
(2)筛选和切片
/**
* 筛选和切片
*
* filter -- 接受Lambda,从流中排除某些元素
* limit -- 截断流,使其元素不超过某个给定数量
* skip -- 跳过元素,返回一个扔掉了前n个元素的流,若流中元素不足n个,则返回一个空流,与limit互补。
* distinct -- 去重,通过hashcode和equals去重。
*/
List<Employee> list = Arrays.asList(
new Employee("张三", "上海", 5000, 22),
new Employee("李四", "北京", 4000, 23),
new Employee("c五", "日本", 6000, 50),
new Employee("b七", "香港", 7000, 50),
new Employee("赵六", "纽约", 1000, 8)
);
@Test
public void test1(){
Stream<Employee> stream = list.stream();//创建流
stream
.filter(e -> e.getAge()>25)//过滤符合条件的流元素
.limit(5)//只取5个
.skip(4)//跳过4个
.distinct()//去重,需重写hashcode和equals方法
.forEach(System.out::println);//终止操作,获取流
}
转载自https://blog.csdn.net/op134972/article/details/76408237?locationNum=1&fps=1