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新特性的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 8 主要新特性 ----------------JDK1.8优点概括

JDK1.8新特性

Java8(JDK1.8)新特性

jdk1.8新特性Lambda表达式方法引用

jdk1.8新特性之lambda表达式

jdk1.8新特性