美文网首页
Java8 教程第三章之Stream filter(一)

Java8 教程第三章之Stream filter(一)

作者: PrimaryKeyEnoch | 来源:发表于2019-08-11 16:45 被阅读0次

    本套JAVA8教程由于是有英文翻译过来的,如果有翻译不对的地方还请多多包涵。

    本节课先简单的介绍下Java8有哪些新特性,对于Java6/7版本做出哪些更改.那废话不多说,赶紧开始今天的课程吧.

    在这篇教程中我将向你展示 filter(), collect(), findAny() 和 orElse() 的用法

    Streams 中 filter() 和 collect() 函数的用法

    在 Java 8 以前, 我们会像下面这样过滤一个 List:

       public static void main(String[] args) {
    
            List<String> lines = Arrays.asList("spring", "hibernate", "neo4j");
            List<String> result = getFilterOutput(lines, "neo4j");
            for (String temp : result) {
                System.out.println(temp);  
            }
    
        }
    
        private static List<String> getFilterOutput(List<String> lines, String filter) {
            List<String> result = new ArrayList<>();
            for (String line : lines) {
                if (!filter.equals(line)) { 
                    result.add(line);
                }
            }
            return result;
        }
    
    

    以上代码大致意思就是创建了一个list容器,里面存放了spring,hibernate,neo4j三个字符串元素,现在我要过滤出list容器不等于neo4j的元素. 大佬们肯定都能看懂吧,结果肯定输入spring,hibernate

    那么现在就用Java8 开始替换: 使用collect()将一个List转化为steam(流),然后使用stream.filter() 来过滤它.

        public static void main(String[] args) {
            List<String> lines = Arrays.asList("spring", "hibernate", "neo4j");
            List<String> result = lines.stream()                // 转化为一个流
                    .filter(line -> !"neo4j".equals(line))     // 排除 'String'
                    .collect(Collectors.toList());              // 吧输出流收集回List中
            result.forEach(System.out::println);                //输出 : spring, hibernate
        }
    

    是不是很简单, 小伙伴赶紧动手敲一下吧

    Streams 中 filter(), findAny() 和 orElse()的用法

    下面直接上代码

      @Data
      @NoArgsConstructor
      @AllArgsConstructor
      public class User {
    
        private String name;
        private int age;
    
    }
    

    在Java 8以前, 你想通过name获取一个Person通常像这样 :

     public static void main(String[] args) {
    
            List<User> userList = Arrays.asList(
                    new User("mkyong", 30),
                    new User("jack", 20),
                    new User("lawrence", 40)
            );
    
            User result = getStudentByName(userList, "jack");
            System.out.println(result);
    
        }
    
     private static User getStudentByName(List<User> userList, String name) {
            User result = null;
            for (User temp : userList) {
                if (name.equals(temp.getName())) {
                    result = temp;
                }
            }
            return result;
     }
    

    输入结果可想而知 User{name='Enoch', age=40}

    那么赶紧看下在Java 8中怎么实现吧, 下面使用 stream.filter()来过滤 List,使用 .findAny().orElse (null) 来返回指定的对象.直接上代码

    public static void main(String[] args) {
    
            List<User> userList = Arrays.asList(
                    new User("张三", 30),
                    new User("李四", 20),
                    new User("Enoch", 40)
            );
            User result1 = userList.stream()                        // 转化为流
                    .filter(x -> "Enoch".equals(x.getName()))        // 只过滤出"Enoch"
                    .findAny()                                      // 如果找到了就返回
                    .orElse(null);                                  // 如果找不到就返回null
    
            System.out.println(result1);
    
            User result2 = userList.stream()
                    .filter(x -> "Enoch".equals(x.getName()))
                    .findAny()
                    .orElse(null);
    
            System.out.println(result2);
    
        }
    

    是不是超级简单,小伙子不要飘啊, 那下面看看这段代码是否能看懂呢

    public static void main(String[] args) {
    
            List<User> userList = Arrays.asList(
                    new User("张三", 30),
                    new User("李四", 20),
                    new User("Enoch", 40)
            );
            User result1 = userList.stream()
                    .filter((p) -> "李四".equals(p.getName()) && 20 == p.getAge())
                    .findAny()
                    .orElse(null);
            System.out.println("result 1 :" + result1);
    
            //或者这样写
            User result2 = userList.stream()
                    .filter(p -> "Enoch".equals(p.getName()) && 20 == p.getAge()).findAny()
                    .orElse(null);
            System.out.println("result 2 :" + result2);
    }
    

    如果上面也看懂了那么恭喜你,好厉害, 那下面继续往下看吧

    Streams中 filter() 和 map()的用法

     public static void main(String[] args) {
            List<User> userList = Arrays.asList(
                    new User("张三", 30),
                    new User("李四", 20),
                    new User("Enoch", 40)
            );
            String name = userList.stream()
                    .filter(x -> "Enoch".equals(x.getName()))
                    .map(User::getName)                        //吧流转化为String,这里其实就是
                                              //把一个新的事物转为另外一种事物了.类型得到了转换
                    .findAny()
                    .orElse("");
            System.out.println("name : " + name);
            List<String> collect = userList.stream()
                    .map(User::getName)
                    .collect(Collectors.toList());
            collect.forEach(System.out::println);
        }
    

    map()函数解释: 如果有一个函数可以将一种类型的值转换成另外一种类型,map 操作就可以 使用该函数,将一个流中的值转换成一个新的流。 map 是 Stream 上最常用的操作之一
    小伙伴们没有看懂map不要紧哦,下一章会继续介绍map哦,come on
    是不是很简单呢. 其实要想理解map还是稍微有难度的. 如果有什么疑问请欢迎留言哦.

    相关文章

      网友评论

          本文标题:Java8 教程第三章之Stream filter(一)

          本文链接:https://www.haomeiwen.com/subject/vedsjctx.html