JDK1.8新特性
Posted kasi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK1.8新特性相关的知识,希望对你有一定的参考价值。
最近发现公司的某高级程序员用JDK1.8新特性写了很多有逼格的代码,遂学习了一波,在这里分享一下stream流,他的出现在一定程度上改善了之前的for循环臃肿的代码,看起来更有逼格,在了解stream之前要先了解一些基本的lambda表达式知识,我先假设你已经懂了(- -),我们直接通过案例来了解stream
stream分为创建流、中间操作和终止操作,我们用的比较多的是后面两个
首先定义一个demo方便后面演示
/* User对象*/
@Data
public class User {
/* 姓名 */
private String name;
/* 年龄 */
private Integer age;
}
/* 先构造一个集合 */
public class StreamMiddle {
public static void main(String[] args) {
List<User> list = new ArrayList<>();
list.add(new User("谢逊", 49));
list.add(new User("黛绮丝", 29));
list.add(new User("殷天正", 59));
list.add(new User("韦一笑", 39));
}
}
1、stream中间操作
1.1 forEach循环
/* 条件:循环list */
/* 使用for循环 */
for (User user : list) {
System.out.println(user);
}
/* 使用forEach*/
list.forEach(x-> System.out.println(x));
1.2 filter过滤
/* 条件:筛选30岁以上人员 */
/* 使用for循环 */
for (User user : list) {
if (user.getAge() > 30) {
System.out.println("for循环:"+user);
}
}
System.out.println("-------------------------------------");
/* 使用filter */
list.stream().filter(x->x.getAge()>30).forEach(y-> System.out.println("forEach:" + y));
1.3 map构造
双冒号意思等同于x-x.getName()
/* 30岁以上人员姓名 */
list.stream().filter(x->x.getAge()>30).map(User::getName).forEach(System.out::println);
1.4 sorted排序
/* 筛选30岁以上人员姓名,并倒序排列 */
list.stream().filter(x->x.getAge()>30).sorted((e1,e2)->{
return e2.getAge().compareTo(e1.getAge());
}).forEach(System.out::println);
1.5 limit限定值,同mysql的limit一个意思
/* 筛选30岁以上人员姓名,并倒序排列后取前两位 */
list.stream().filter(x->x.getAge()>30).sorted((e1,e2)->{
return e2.getAge().compareTo(e1.getAge());
}).limit(2).forEach(System.out::println);
1.6 distinct去重
先给list增加一笔重复数据
List<User> list = new ArrayList<>();
list.add(new User("谢逊", 49));
list.add(new User("黛绮丝", 29));
list.add(new User("殷天正", 59));
list.add(new User("韦一笑", 39));
list.add(new User("谢逊", 49));
for (User user : list) {
System.out.println("for循环"+user);
}
System.out.println("-------------------------");
/* distinct去重*/
list.stream().distinct().forEach(System.out::println);
2. 终止操作
2.1 普通元素
allMatch-检查是否匹配所有元素
anyMatch-检查是否至少匹配一个元素
noneMatch-检查是否没有匹配所有元素
findFirst-返回第一个元素
findAny-返回当前流中的任意元素
count-返回流中元素的总个数
max-返回流中最大值
min-返回流中最小值
这几个用法都差不多,下面不一一演示了,举几个例子
/* 判断是否所有对象年龄超过20岁 */
boolean b = list.stream().allMatch(x -> x.getAge() > 20);
System.out.println("判断是否所有对象年龄超过20岁:" + b);
/* 返回年龄最大的对象 */
User user = list.stream().max((e1, e2) -> e1.getAge().compareTo(e2.getAge())).get();
System.out.println("返回年龄最大的对象" +user);
2.2 reduce将元素反复操作
/* 将年龄加总 */
Integer integer = list.stream().map(User::getAge).reduce(Integer::sum).get();
System.out.println("将年龄加总:" + integer);
/* 拼接30岁以上对象姓名 */
String s = list.stream().filter(x -> x.getAge() > 30).map(User::getName).reduce((x, y) -> x + y).get();
System.out.println("拼接30岁以上对象姓名:" + s);
2.3 collect将流转换成其他形式
/* 将对象集合中的name取出拼接成list集合 */
List<String> collect1 = list.stream().map(User::getName).collect(Collectors.toList());
System.out.println("-------将对象集合中的name取出拼接成list集合----------");
collect1.forEach(System.out::println);
/* 将对象属性转成map */
Map<String, Integer> collect2= list.stream().distinct().collect(Collectors.toMap(x -> x.getName(), y -> y.getAge()));
System.out.println("-------将对象属性转成map----------");
collect2.forEach((x,y)-> System.out.println("key-"+x+":::"+ "value-"+y));
/* 将对象姓名拼接成String并用分隔符隔开*/
String collect3 = list.stream().map(User::getName).collect(Collectors.joining(","));
System.out.println("-------将对象姓名拼接成String并用分隔符隔开----------");
System.out.println(collect3);
reduce和collect的实际功能非常强大,远远超过我上面列子的范畴,有兴趣的可以再做深入研究
以上是关于JDK1.8新特性的主要内容,如果未能解决你的问题,请参考以下文章