栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java8中Stream的使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java8中Stream的使用

stream

java.util.StreamStream 的创建需要指定一个数据源,比如java.util.Collection 的子类,List
或者 Set, Map 不支持

Stream类型

  1. 串行
  2. 并行
过滤
// 过滤
List strings = Arrays.asList("cde", "avc", "qwe", "alk", "eee");
strings.stream()
	.filter(s -> s.startsWith("a"))
	.forEach(System.out::println);


List strings = Arrays.asList("zz", "vv", "ddd", "cd", "bc");
strings.stream().filter(s -> s.startsWith("z")).forEach(System.out::println);//zz
//        strings.stream().filter("z"::startsWith).forEach(System.out::println);//沒有
//        strings.stream().filter("zz"::startsWith).forEach(System.out::println);//zz
// 注意:startsWith,用方法引用的时候,是z当作参数,而lambda是list的每个元素作为参数
排序
List s2 = Arrays.asList("cde", "avc", "qwe", "alk", "eee");
        s2.stream()
                .filter(s -> s.startsWith("a"))
                .sorted()
                .forEach(System.out::println);

映射
// 映射
        List s3 = Arrays.asList("cde", "avc", "qwe", "alk", "eee");
        s3.stream().filter(s -> s.startsWith("a"))
                .sorted()
                .map(s -> s + "yes!")
                .forEach(System.out::println);


匹配
List s3 = Arrays.asList("cde", "avc", "qwe", "alk", "eee");
        boolean b = s3.stream()
                .anyMatch(s -> s.endsWith("e")); // 有

        boolean b1 = s3.stream()
                .noneMatch(s -> s.endsWith("e"));// 没有

        boolean b2 = s3.stream()
                .allMatch(s -> s.endsWith("e")); // 所有
        System.out.println(b + " " + b1 + " " + b2);

// true false false
计数
List s4 = Arrays.asList("cde", "avc", "qwe", "alk", "eee");
        long s1 = s4.stream().filter(s -> s.startsWith("s")).count();
        System.out.println(s1);

// 0
规约
List s5 = Arrays.asList("cde", "avc", "qwe", "alk", "eee");
Optional reduce = s5.stream().sorted()
        .reduce((s1, s2) -> s1 + "," + s2);
reduce.ifPresent(System.out::println);
// alk,avc,cde,eee,qwe
Stream->Array
List strings = Arrays.asList("zz", "vv", "ddd", "cd", "bc");
        // Stream转成数组
        String[] strings1 = strings.stream().toArray(String[]::new);
        System.out.println(Arrays.toString(strings1));
collect
List strings = Arrays.asList("zz", "vv", "zdd", "zcd", "bc");
        // collect
        strings.stream().filter(s -> s.startsWith("z"))
                .sorted(String::compareTo)
                .map(s -> s + "!")
                .collect(Collectors.toList())
                .forEach(System.out::println);

// 还有 Collectors.toSet

Collectors.toMap

List list = new ArrayList();        UserRequest u1 = new UserRequest();        u1.setId(1L);        u1.setUserName("u1");        UserRequest u2 = new UserRequest();        u2.setId(2L);        u2.setUserName("u2");        list.add(u1);        list.add(u2);        Map collect = list.stream().collect(Collectors.toMap(UserRequest::getId, Function.identity()));        collect.forEach((k, v) -> System.out.println(k + ": " + v));

如果key有一样的则会报错,解决方案如下:

 List list = new ArrayList();        UserRequest u1 = new UserRequest();        u1.setId(1L);        u1.setUserName("u1");        UserRequest u2 = new UserRequest();        u2.setId(1L);        u2.setUserName("u2");        list.add(u1);        list.add(u2);// (v1,v2)->v2第三个参数表示,如果key的值一样,则用后面添加的作为value// (v1,v2)->v1第三个参数表示,如果key的值一样,则用第一次添加的作为value        Map collect1 = list.stream().collect(Collectors.toMap(UserRequest::getId, Function.identity(), (v1, v2) -> v2));        collect1.forEach((k, v) -> System.out.println(k + ": " + v));
joining

list变为字符串

String z = strings.stream().filter(s -> s.startsWith("z"))        .sorted(String::compareTo)        .map(s -> s + "!")        .collect(Collectors.joining(","));
延迟执行
@Testpublic void laziness(){  List strings = Arrays.asList("abc", "def", "gkh", "abc");  Stream stream = strings.stream().filter(new Predicate() {      @Override      public boolean test(Object o) {        System.out.println("Predicate.test 执行");        return true;        }      });   System.out.println("count 执行");   stream.count();}count 执行Predicate.test 执行Predicate.test 执行Predicate.test 执行Predicate.test 执行// 按执行顺序应该是先打印 4 次「Predicate.test 执行」,再打印「count 执行」。实际结果恰恰相反。说明 filter 中的方法并没有立刻执行,而是等调用count()方法后才执行。
Parallel Stream

并行流

串行Stream是一个线程依次完成,并行流是多个线程同时进行

int max = 10000000;        List list = new ArrayList();        for (int i = 0; i < max; i++) {            UUID uuid = UUID.randomUUID();            list.add(uuid.toString());        }        long startTime = System.currentTimeMillis();        list.parallelStream().sorted();        long endTime = System.currentTimeMillis();        System.out.println(endTime - startTime);
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/274712.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号