java 1.8新特性 lambda表达式 - stream流操作

2019-08-29 09:01:42来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

java 1.8新特性 lambda表达式 - stream流操作

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());

 













原文链接:https://www.cnblogs.com/jiuya/p/11420343.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:java反射原理,应用

下一篇:Java WeakHashMap