java流式编程常用技巧

流操作的类型有三种:创建流,修改流元素(中间操作, Intermediate Operations),消费流元素(终端操作, Terminal Operations)。

如果Stream只有中间操作是不会执行的,当执行终端操作的时候才会执行中间操作,这种方式称为延迟加载或惰性求值。多个中间操作组成一个中间操作链,只有当执行终端操作的时候才会执行一遍中间操作链,具体是因为什么我们在后面再说明。下面看下Stream有哪些中间操作。

创建方式,分为三类,数组,list,set的创建流

技巧1:随机数产生流

        new Random(47)
//       ints() 方法产生一个流并且 ints() 方法有多种方式的重载
//      — 两个参数限定了数值产生的边界。这将生成一个整数流
                .ints(5,60)
                .distinct()//distinct() 来获取它们的非重复值
                .limit(7)//使用 limit() 方法获取前 7 个元素
                .sorted()//使用 sorted() 方法排序
//                forEach() 方法遍历输出,它根据传递给它的函数对每个
//                流对象执行操作。
                .forEach(System.out::println);
//        我们传递了一个可以在控制台显示每个元素的方法引用。System.out::println

技巧2:map转换流

//我们首先调用 entrySet() 产生一个对象流,每个对象都包含一个 key 键以及与其相关联的 value 值
//        将对象作为e参数传到后面,
        m.entrySet().stream().map(e -> e.getKey()+":"+
                e.getValue()).forEach(System.out::println);

技巧3:自定义类实现流式写法

public class Fibonacci {
    int x =1;
//    匿名函数
    Stream numbers(){
//        lambada表达式的函数
        return Stream.iterate(0,i ->{
            int result = x +i;
            x = i;
            return result;
        });
    }

    public static void main(String[] args) {
        new Fibonacci().numbers()
                .skip(10)
                .limit(10)
                .forEach(System.out::println);
    }


}
/*
斐波那契数列就是签两个数相加得到写一个元素
55
89
144
233
377
610
987
1597
2584
418
 */

技巧4:流式集合之间转换

 //收集名称到List
 List nameList = users.stream().map(User::getName).collect(Collectors.toList());
 //收集名称到List
 Set nameSet = users.stream().map(User::getName).collect(Collectors.toSet());
 //收集到map,名字作为key,user对象作为value
 Map userMap = users.stream()
                .collect(Collectors.toMap(User::getName, Function.identity(), (k1, k2) -> k2));

技巧5:分组集合

        List list = metadataPropertyMapper.getList(new HashMap<>());
        if (CollectionUtils.isNotEmpty(list)) {
            Map> collect = list
                    .stream()
                    .collect(Collectors.groupingBy(MetadataPropertyDO::getKaId));

你可能感兴趣的:(java基础,java,开发语言,后端,流式编程,stream)