zoukankan      html  css  js  c++  java
  • java 1.8新特性 lambda表达式

    1.8新特性
    
    lambda表达式
        资料:
            1. Consumer接口
                https://blog.csdn.net/qq_28410283/article/details/80618456
            2.java8 Lambda表达式简介    
                https://blog.csdn.net/qq_28410283/article/details/80961022
            3.菜鸟教程  Java 8 Lambda 表达式
                https://www.runoob.com/java/java8-lambda-expressions.html
                
                
        Consumer  语义是消费的意思,
            public interface Consumer<T> {
                void accept(T t);  
                    //消费  
                    //主要是对入参做一些列的操作,在stream里,主要是用于forEach;内部迭代的时候,对传入的参数,做一系列的业务操作,没有返回值;
                default Consumer<T> andThen(Consumer<? super T> after)
                    //传入一个Consumer类型的参数,它的泛型类型,
                    //跟本接口是一致的T,先做本接口的accept操作,
                    //然后在做传入的Consumer类型的参数的accept操作
    
        Lambda 表达式的简单例子:
            1. 不需要参数,返回值为 5  
                () -> 5  
            2. 接收一个参数(数字类型),返回其2倍的值  
                x -> 2 * x        
            3. 接受2个参数(数字),并返回他们的差值  
                (x, y) -> x – y   
            4. 接收2个int型整数,返回他们的和  
                (int x, int y) -> x + y   
            5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
                (String s) -> System.out.print(s)        
        使用 Lambda 表达式需要注意以下两点:
            Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。在上面例子中,我们使用各种类型的Lambda表达式来定义MathOperation接口的方法。然后我们定义了sayMessage的执行。
            Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。
        变量作用域
            lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
            lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)
    
        
        
    stream流操作
        资料:
            1.Java的Stream流式处理
                https://blog.csdn.net/qq_20989105/article/details/81234175
            2.Java 8 Stream | 菜鸟教程   //实际使用教程
                https://www.runoob.com/java/java8-streams.html
    简介: Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation), 或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。同时它提供串行 和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。通常编写并行代码很 难而且容易出错, 但使用Stream API无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。 顺序: | stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect| 生成流 集合接口有两个方法来生成流: stream() − 为集合创建串行流。 parallelStream() − 为集合创建并行流。 例: List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList()); forEach Random random = new Random(); random.ints().limit(10).forEach(System.out::println); map List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); // 获取对应的平方数 List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList()); filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串: limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 10 条数据: sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序: Random random = new Random(); random.ints().limit(10).sorted().forEach(System.out::println); parallelStream 并行程序 流并行处理程序的代替方法。以下实例我们使用 parallelStream 来输出空字符串的数量 List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); // 获取空字符串的数量 int count = strings.parallelStream().filter(string -> string.isEmpty()).count(); Collectors Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串: List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList()); System.out.println("筛选列表: " + filtered); String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", ")); System.out.println("合并字符串: " + mergedString); 统计 另外,一些产生统计结果的收集器也非常有用。它们主要用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。 List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics(); System.out.println("列表中最大的数 : " + stats.getMax()); System.out.println("列表中最小的数 : " + stats.getMin()); System.out.println("所有数之和 : " + stats.getSum()); System.out.println("平均数 : " + stats.getAverage());












  • 相关阅读:
    django页面分类和继承
    django前端从数据库获取请求参数
    pycharm配置django工程
    django 应用各个py文件代码
    CF. 1428G2. Lucky Numbers(背包DP 二进制优化 贪心)
    HDU. 6566. The Hanged Man(树形背包DP DFS序 重链剖分)
    小米邀请赛 决赛. B. Rikka with Maximum Segment Sum(分治 决策单调性)
    区间树 学习笔记
    CF GYM. 102861M. Machine Gun(主席树)
    2016-2017 ACM-ICPC East Central North America Regional Contest (ECNA 2016) (B, D, G, H)
  • 原文地址:https://www.cnblogs.com/jiuya/p/11420343.html
Copyright © 2011-2022 走看看