Java8之Stream流化

在这里插入图片描述

  • 例子:突出lambda表达式的优点;简化代码
/**
 * jdk1.8之前写法与jdk1.8现在写法 对比
 */
public class Demo1 {

    private static final List<String> STR_LIST = Lists.newArrayList("ab", "xyz", "789", "axy", "azzzzz", "a678", "a1234");

    public static void main(String[] args) {
        // 过滤字符串,找到以a开头的,排序,后生成一个字符串,并用,进行分割
        // abc,axy,azz -> "abc,axy,azz"

        foo1();

        foo2();
    }

    /**
     * 使用jdk1.8之前的原生写法
     */
    public static void foo1() {
        List<String> bufList = Lists.newArrayList();
        for (String s : STR_LIST) {
            if (!s.startsWith("a")) {
                continue;
            }

            bufList.add(s);
        }

        bufList.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return Integer.compare(o1.length(), o2.length());
            }
        });

        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < bufList.size(); i++) {
            if (i == bufList.size() - 1) {
                builder.append(bufList.get(i));
                continue;
            }

            builder.append(bufList.get(i)).append(",");
        }

        String result = builder.toString();

        System.out.println("foo1 result = " + result);
    }

    /**
     * 使用jdk1.8 lambda+stream来处理
     */
    public static void foo2() {
        String result = STR_LIST.stream()
                .filter(str -> str.startsWith("a"))
                .sorted(Comparator.comparingInt(String::length))
                .collect(Collectors.joining(","));

        System.out.println("foo2 result = " + result);
    }
}

将集合流化

public static void main(String[] args) {
        List<String> strs = Lists.newArrayList("ab", "xyz", "789", "axy", "azzzzz", "a678", "a1234");
        Set<String> sets = Sets.newHashSet();
        int[] arr = new int[10];

       
        // 2.并行流
        strs.parallelStream();
        sets.parallelStream();
  • 创建普通流
    正常操作 ,数据量比较小
 // 1.流化操作,普通流
        strs.stream();
        sets.stream();
        Arrays.stream(arr);

  • 创建并行流
    数据量比较大,提升效率,提升性能(上w,几十w)
    在这里插入图片描述
 // 1.流化操作,普通流
        strs.stream();
        sets.stream();
        Arrays.stream(arr);

中间操作,过滤器,filter演示

 private static void testFilter(List<String> strs) {
        strs.stream()
                //第一个过滤器,长度大于等于5;第二个过滤器已b开头;二个条件需全部满足
                .filter(str -> str.length() >= 5)
                .filter(str -> str.startsWith("b"))
                .forEach(str -> System.out.println("str=" + str));
    }

中间操作 映射操作

private static void testMap(List<String> strs) {
        strs.stream()
                .map(str -> str.toUpperCase())
                .map(str -> str +";")
                .forEach(str -> System.out.println("str="+str));

结果

str=AB;
str=BYZ;
str=789;
str=AXY;
str=AZZZZZ;
str=A678;
str=A1234;
str=B1236;

中间操作 排序

 private static void testSort(List<String> strs) {
        //默认的排序方式
        strs.stream()
                .sorted().forEach(str -> System.out.println("str = " + str));
        System.out.println("=================");
        strs.stream()
                .sorted().sorted(Comparator.comparingInt(String::length)).forEach(str -> System.out.println("str = " + str));

中间操作: skip +limit

 /**
     * 中间操作: skip +limit
     * 跳过几个,限制几行;类似分页
     * @param strs
     */
    private static void testLimitAndSkip(List<String> strs) {
        strs.stream()
                .skip(2)
                .limit(3)
                .forEach(str -> System.out.println("str = " + str));

    }

中间操作 peek

我们看不到流的操作,想看的话,就用peek;
不改变数据,输出每个节点的数据
在这里插入图片描述

中间操作 flatMap((对流扁平化处理)) ------难点

 private static void testFlatMap() {
        List<List<String>> strsList = Lists.newArrayList();

        List<String> strs1 = Lists.newArrayList("ab", "byz", "789");
        List<String> strs2 = Lists.newArrayList("abc", "byz", "89y");
        List<String> strs3 = Lists.newArrayList("yab", "byc", "sdf");

        strsList.add(strs1);
        strsList.add(strs2);
        strsList.add(strs3);

        // -------
        // 需求: 将大集合中的所有字符串 全部转成大写
        // 用之前所学的转化操作,就这样搞,但是比较恶心.
        // Stream<List<String>> stream = strsList.stream();
        // stream.forEach(strList -> {
        //     strList.stream().map(String::toUpperCase).forEach(str -> {
        //         System.out.println("str = " + str);
        //     });
        // });

        strsList.stream()
                // FlatMap做了啥
                // .flatMap(list -> list.stream())
                // .map(str -> str.toUpperCase())
                .flatMap(Collection::stream)
                .map(String::toUpperCase)
                .forEach(str -> System.out.println("str = " + str));

下图是运用flatMap的stream运行流程

结束操作

结束操作


 *   --直接拿到结果
 *        + count
 *        + findFirst
 *        + findAny
 *        + forEach
 *
 *   做统计,collect*

count -统计结果

 private static void testCount(List<String> strs) {
        long count = strs.stream()
                .filter(str -> str.length() > 3)
                // .forEach(str -> System.out.println("str=" + str));
                .peek(str -> System.out.println("str = " + str))
                .count();
        System.out.println("count = " + count);
    }

FindFirst -首个

  private static void testFindFirst(List<String> strs) {
        Optional<String> optional = strs.stream()
                .filter(str -> str.startsWith("a")).findFirst();
        if (optional.isPresent()) {
            String val = optional.get();
            System.out.println("val = " + val);
        }
    }
  • Optional详解-tudo
    在这里插入图片描述

collect操作

Collectors.toSet() ,转成List(集合)

 private static void testCollectToSet(List<String> strs) {
        Set<String> data = strs.stream()
                .filter(str -> str.length() > 3)
                .map(str -> str + "*")
                .collect(Collectors.toSet());
        System.out.println("data = " + data);
    }

结果

data = [b1236*, y123*, x123*, a678*, axylonglog*, a12345*, z123*, azzzzz*]

Collectors.toMap(),转成k,v形式

  private static void testCollectToMap(List<String> strs) {
        Map<String, Integer> data = strs.stream()
                .filter(str -> str.length() > 3)
                .map(str -> str + "*")
                .distinct()
                .collect(Collectors.toMap(str -> str, str -> str.length()));
        data.forEach((k,v)->{
            System.out.println("data map k = " + k+",v="+v);
        });
    }

结果

data map k = b1236*,v=6
data map k = y123*,v=5
data map k = x123*,v=5
data map k = a678*,v=5
data map k = axylonglog*,v=11
data map k = a12345*,v=7
data map k = z123*,v=5
data map k = azzzzz*,v=7

Collectors.groupingBy() ,分组

 private static void testGroupBy(List<String> strs) {
        Map<Integer, List<String>> data = strs.stream()
                .filter(str -> !Strings.isNullOrEmpty(str))
                .collect(Collectors.groupingBy(str -> str.length()));
        data.forEach((k,v)->{
            System.out.println("所属长度="+k);
            System.out.println("     数据内容=="+v);
            System.out.println("\n");
        });
    }

结果

所属长度=2
     数据内容==[ab]


所属长度=3
     数据内容==[byz, 789]


所属长度=4
     数据内容==[a678, x123, y123, z123]


所属长度=5
     数据内容==[b1236]


所属长度=6
     数据内容==[azzzzz, azzzzz, azzzzz, azzzzz, a12345, a12345, a12345]


所属长度=10
     数据内容==[axylonglog]

Collectors.partitioning(),已xxx条件分区

在这里插入图片描述

    private static void testPartitioning(List<String> strs) {
        Map<Boolean, List<String>> data = strs.stream()
                .filter(str -> !Strings.isNullOrEmpty(str))
                .collect(Collectors.partitioningBy(str -> str.length() > 5));

        data.forEach((k,v)->{
            if(k){
                System.out.println("分区字符串长度大于5:"+v);
            }else {
                System.out.println("分区字符串长度小于5:"+v);
            }
        });
    }

结果

分区字符串长度小于5[ab, byz, 789, a678, b1236, x123, y123, z123]
分区字符串长度大于5[axylonglog, azzzzz, azzzzz, azzzzz, azzzzz, a12345, a12345, a12345]

Collectors.joining(),已xx连接

  private static void testJoining(List<String> strs) {
        String data = strs.stream()
                .filter(str -> !Strings.isNullOrEmpty(str))
                .collect(Collectors.joining("+"));
        System.out.println("data = " + data);
    }

结果

data = ab+byz+789+axylonglog+azzzzz+azzzzz+azzzzz+azzzzz+a678+a12345+a12345+a12345+b1236+x123+y123+z123

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值