• 流的使用


    筛选与切片

    
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * 筛选与切片
     */
    public class FilterDemo {
        public static void main(String[] args){
            List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
    
            numbers.stream()
                    .filter(i->i%2==0) //使用谓词筛选
                    .distinct() //去重
                    .forEach(System.out::println);
    
            numbers.stream()
                    .limit(3)//截断流
                    .forEach(System.out::println);
    
            //跳过元素,limit(n)和skip(n)是互补的
            // skip(n)方法,返回一个扔掉了前n个元素的流,如果流中元素不足n个,则返回一 个空流
            numbers.stream()
                    .skip(3)
                    .forEach(System.out::println);
    
    
        }
    }
    

    映射

    
    import java.util.Arrays;
    import java.util.List;
    
    
    import static java.util.stream.Collectors.toList;
    
    /**
     * 映射
     */
    public class MapDemo {
        public static void main(String[] args){
            List<Apple> appleList = Arrays.asList(new Apple("red",12),new Apple("yellow",15),new Apple("green",10),new Apple("red",10));
            List<Integer> weigths = appleList.stream()
                    .map(Apple::getWeight)
                    .collect(toList());
    //        System.out.println(weigths);
            List<Integer> colorNameLengths = appleList.stream()
                    .map(Apple::getColor)//获取每个苹果的颜色
                    .map(String::length)//然后获取苹果颜色内容的长度
                    .collect(toList());
    //        System.out.println(colorNameLengths);
    
            //流的扁平化
            String[] words = {"Hello","World"};
            List<String> collect = Arrays.stream(words)
                    .map(w -> w.split(""))//将每个单词转换为由其字母构成的数组
                    .flatMap(Arrays::stream)//将各个生成流扁平化为单个流
                    .distinct()
                    .collect(toList());
            System.out.println(collect);
        }
    }
    
    
    
    import java.util.Arrays;
    import java.util.List;
    
    import static java.util.stream.Collectors.toList;
    
    /**
     * 映射 练习
     */
    public class MapDemo2 {
        public static void main(String[] args){
            //给定一个数字列表,如何返回一个由每个数的平方构成的列表呢?
            // 例如,给定[1, 2, 3, 4,5],应该返回[1, 4, 9, 16, 25]
            List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
            List<Integer> squares = numbers.stream().map(i -> i * i).collect(toList());
            System.out.println(squares);
    
            //给定列表[1, 2, 3]和列表[3, 4],应 该返回[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]
            List<Integer> numbers1 = Arrays.asList(1, 2, 3);
            List<Integer> numbers2 = Arrays.asList(3, 4);
    
            //使用两个map来迭代这两个列表,并生成数对。但这样会返回一个Stream-
            //<Stream<Integer[]>>。你需要让生成的流扁平化,以得到一个Stream<Integer[]>
            List<int[]> pairs = numbers1.stream()
                    .flatMap(i -> numbers2.stream()
                            .map(j -> new int[]{i, j}))
                    .collect(toList());
    
        }
    }
    

    查找和匹配

    
    import java.util.Arrays;
    import java.util.List;
    import java.util.Optional;
    
    /**
     * 查找和匹配
     * anyMatch、allMatch和noneMatch这三个操作都用到了我们所谓的短路
     * 不管表达式有多长,你只需找到一个表达式为false,就可以推断整个表达式 将返回false,所以用不着计算整个表达式。这就是短路
     */
    public class MatchDemo {
        public static void main(String[] args) {
            List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
    
            //检查谓词是否至少匹配一个元素
            if (numbers.stream().anyMatch(i->i%2==0)){
                System.out.println("包含偶数");
            }
            //检查谓词是否匹配所有元素
            if (numbers.stream().allMatch(i->i%2==0)){
                System.out.println("全是偶数");
            }
    
            if (numbers.stream().noneMatch(i->i%2==0)){
                System.out.println("没有偶数");
            }
    
            //查找元素
            //Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在或不存在
            // - isPresent()将在Optional包含值的时候返回true, 否则返回false。
            // - ifPresent(Consumer<T> block)会在值存在的时候执行给定的代码块。Consumer函数式接口;它让你传递一个接收T类型参数,并返回void的Lambda表达式。
            // - T get()会在值存在时返回值,否则抛出一个NoSuchElement异常。
            // - T orElse(T other)会在值存在时返回值,否则返回一个默认值。
            Optional<Integer> number = numbers.stream()
                    .filter(i -> i % 2 == 0)
                    .findAny();
            System.out.println(number.get());//T get()会在值存在时返回值
    
            numbers.stream()
                    .filter(i -> i % 2 == 0)
                    .findAny()
                    .ifPresent(System.out::println);//如果包含一个 值就打印它,否则什么都不做
    
            //查找第一个元素
            System.out.println(numbers.stream()
                    .filter(i -> i % 2 != 0)
                    .findFirst()
                    .orElse(-1));
    
        }
    }
    

    归约(折叠)

    
    import java.util.Arrays;
    import java.util.List;
    import java.util.Optional;
    
    /**
    * 归约(折叠)
    * 将流中所有元素反复结合起来,得到一个值
    */
    public class FoldDemo {
       public static void main(String[] args) {
           //元素求和
           List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
           int sum = 0;
           for (Integer x : numbers) {
               sum += x;
           }
           System.out.println(sum);
    
           //    T reduce(T identity, BinaryOperator<T> accumulator);
           // reduce接受两个参数:
           //  一个初始值,这里是0;
           //  一个BinaryOperator<T>来将两个元素结合起来产生一个新值,这里我们用的是 lambda (a, b) -> a + b
           // reduce操作是如何作用于一个流的:Lambda反复结合每个元素,直到流被归约成一个值
           int sum2 = numbers.stream().reduce(0, (a, b) -> a + b);
           int sum3 = numbers.stream().reduce(0, Integer::sum);
           System.out.println(sum3);
           // 无初始值
           // reduce操作无法返回其和,因为它没有初始值
           Optional<Integer> sumOp = numbers.stream().reduce(Integer::sum);
           System.out.println(sumOp.get());
    
           //最大值和最小值
           System.out.println(numbers.stream().reduce((x, y) -> x > y ? x : y).get());
           System.out.println(numbers.stream().reduce(Integer::max).get());
    
           //计算流中元素的个数
           System.out.println(numbers.stream().map(d -> 1)
                   .reduce(Integer::sum).get());
           //内置count方法可用来计算流中元素的个数
           System.out.println(numbers.stream().count());
       }
    }
    
    
  • 相关阅读:
    2017年陕西省网络空间安全技术大赛WP
    XDCTF2014 Writeup
    TensorFlow入门测试程序
    python计算器
    CentOS安装crontab及使用方法
    在Linux 双机下自己手动实现浮动ip技术
    CentOS 7下安装配置FTP
    encodeURI 解码 编码
    jquery 消息提醒插件 toastmessage
    搭通自己的电脑与GitHub的传输通道
  • 原文地址:https://www.cnblogs.com/fly-book/p/12642671.html
Copyright © 2020-2023  润新知