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

2019-08-11  本文已影响0人  PrimaryKeyEnoch

本套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还是稍微有难度的. 如果有什么疑问请欢迎留言哦.

上一篇下一篇

猜你喜欢

热点阅读