美文网首页
JDK1.8新特性Stream解释

JDK1.8新特性Stream解释

作者: 1ff5a98e5398 | 来源:发表于2018-11-29 16:52 被阅读15次

说明

不要在傻傻地写循环遍历了,使用Stream处理集合更加的简洁明了。
需要掌握lambda表达式写法。


环境

JAVA8


Stream类的常用api

这里只列出本人在工作中常用的api,想要查看更具体的可以参考jdk1.8官方文档。

初始化

初始化一个Stream常用到两种方法:

方法一:List的stream()方法

    @Test
    public void listInit(){
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        Stream<String> stream = list.stream();
    }

方法二:Stream.of()方法

    @Test
    public void streamOfInit(){
        // 第一种
        Stream<String> stream = Stream.of("a", "b", "c", "d");
        
        // 第二种
        String [] strings = {"a","b","c"};
        Stream<String> stream1 = Stream.of(strings);
    }

filter过滤

挑选需要的元素,比如:下方例子把dog字符串过滤掉

    /**
     * 过滤
     */
    @Test
    public void filter() {
        String[] strings = {"apple", "banana", "cat", "dog"};
        List<String> list = Stream.of(strings).filter(e -> !StringUtils.equals(e, "dog")).collect(Collectors.toList());
        System.out.println(JSON.toJSONString(list));
    }

输出结果:

["apple","banana","cat"]

map 生成新的集合

这里有两个类

    @Data
    @AllArgsConstructor
    public static class Person {
        private Integer id;
        private String name;
    }

    @Data
    public static class Man {
        private Integer id;
        private String name;
    }

把一个List<Person>转化成List<Man

    @Test
    public void map2() {
        List<Person> list = new ArrayList<>();
        list.add(new Person(1, "loger"));
        list.add(new Person(2, "chenle"));
        List<Man> manList = list.stream().map(e -> {
            Man man = new Man();
            man.setId(e.getId());
            man.setName(e.getName());
            return man;
        }).collect(Collectors.toList());
        System.out.println(JSON.toJSONString(manList));
    }

输出结果

[{"id":1,"name":"loger"},{"id":2,"name":"chenle"}]

Collectors.toMap 把list拼接成需要的map

这个在向数据库查询list数据的时候经常用到

    @Test
    public void testCollectToMap() {
        List<Person> list = new ArrayList<>();
        list.add(new Person(1, "loger"));
        list.add(new Person(2, "chenle"));
        Map<Integer, Person> personMap = list.stream().collect(Collectors.toMap(Person::getId, e -> e));
        System.out.println(JSON.toJSONString(personMap));
        Map<Integer, String> nameMap = list.stream().collect(Collectors.toMap(Person::getId, Person::getName));
        System.out.println(JSON.toJSONString(nameMap));
    }

输出结果

{1:{"id":1,"name":"loger"},2:{"id":2,"name":"chenle"}}
{1:"loger",2:"chenle"}

sort排序

无参的sort方法只支持基本数据类型,包装类型,String(可能还有'等')的自然顺序排序
···
@Test
public void sort() {

    // 自然顺序排序 基本数据类型 字符串
    List<String> collect = Stream.of("1", "5", "2", "9", "3", "4").sorted().collect(Collectors.toList());
    System.out.println(JSON.toJSONString(collect));

    List<Person> list = new ArrayList<>();
    list.add(new Person(1, "loger"));
    list.add(new Person(2, "chenle"));
    // 自然顺序排序
    List<Person> personList = list.stream().sorted((o1, o2) -> {
        if(o1.getId() > o2.getId()){
            return 1;
        } else if(o1.getId().equals(o2.getId())){
            return 0;
        } else {
            return -1;
        }
    }).collect(Collectors.toList());
    System.out.println(JSON.toJSONString(personList));
}

···
输出结果

["1","2","3","4","5","9"]
[{"id":1,"name":"loger"},{"id":2,"name":"chenle"}]

skip和limit

这个相当于MySQL的limit n,m,与MongoDB的skip、limit用法是一致的。意思就是跨过几行记录,取几行记录的意思。

    @Test
    public void skipAndLimit(){
        List<String> list = Stream.of("1", "5", "2", "9", "3", "4").skip(2).limit(3).collect(Collectors.toList());
        System.out.println(JSON.toJSONString(list));
    }

输出结果

["2","9","3"]

总结

常用的Stream操作都在这里列举了,只要记住每个方法的用途,根据IDE的提示使用即可,不需要去记住。另外要熟练使用lambda表达式。

相关文章

网友评论

      本文标题:JDK1.8新特性Stream解释

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