前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java8新特性Lambda和Stream

java8新特性Lambda和Stream

作者头像
KEN DO EVERTHING
发布2019-01-17 16:07:08
5360
发布2019-01-17 16:07:08
举报
文章被收录于专栏:KEN DO EVERTHINGKEN DO EVERTHING

Java8出来已经4年,但还是有很多人用上了jdk8,但并没用到里面的新东西,那不就等于没用?jdk8有许多的新特性,详细可看下面脑图

我只讲两个最重要的特性Lambda和Stram,配合起来用可以极大提高生产力,写出高效率、干净、简洁的代码。

一、Lambda表达式

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

语法

lambda 表达式的语法格式如下:

代码语言:javascript
复制
(parameters) -> expression
或
(parameters) ->{ statements; }

下面是Java lambda表达式的简单例子:

代码语言:javascript
复制
// 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怎么用

1. for循环遍历
代码语言:javascript
复制
String[] atp = {"Rafael Nadal", "Novak Djokovic",
       "Stanislas Wawrinka",
       "David Ferrer","Roger Federer",
       "Andy Murray","Tomas Berdych",
       "Juan Martin Del Potro"};
List<String> players =  Arrays.asList(atp);

// Java 8之前:
for (String player : players) {
     System.out.print(player + "; ");
}

// Java 8:使用 lambda 表达式以及函数操作(functional operation)
players.forEach((player) -> System.out.print(player + "; "));

// 在 Java 8 中使用双冒号操作符(double colon operator)
players.forEach(System.out::println);
2. 代替匿名内部类
(1) lambdas 实现 Runnable 接口
代码语言:javascript
复制
// Java 8之前:
new Thread(new Runnable() {  
    @Override  
    public void run() {  
        System.out.println("Hello world !");  
    }  
}).start();  

//  Java 8方式:
new Thread(() -> System.out.println("Hello world !")).start();  

// Java 8之前:
Runnable race1 = new Runnable() {  
    @Override  
    public void run() {  
        System.out.println("Hello world !");  
    }  
};  

//  Java 8方式:
Runnable race2 = () -> System.out.println("Hello world !");  

// 直接调用 run 方法  
race1.run();  
race2.run(); 
(2) lambda进行集合排序
代码语言:javascript
复制
String[] players = {"Rafael Nadal", "Novak Djokovic",   
    "Stanislas Wawrinka", "David Ferrer",  
    "Roger Federer", "Andy Murray",  
    "Tomas Berdych", "Juan Martin Del Potro",  
    "Richard Gasquet", "John Isner"};  

// Java 8之前:
Arrays.sort(players, new Comparator<String>() {  
    @Override  
    public int compare(String s1, String s2) {  
        return (s1.compareTo(s2));  
    }  
}); 

// Java 8方式:
Comparator<String> sortByName = (String s1, String s2) -> (s1.compareTo(s2));  
Arrays.sort(players, sortByName);  

// Java 8方式:另一种形式 
Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2))); 
二、Stream

stream的定义是什么?一个简单的定义是:"对一个源中的一系列元素进行聚合操作。" 使用Stream,可以像SQL一样操作数据。 可操作的数据有集合,数组,I/O channel, 产生器generator 等。

Sream的主要使用方式

1. forEach

'forEach' 来迭代流中的每个数据。以下代码片段使用 forEach 输出了10个随机数:

代码语言:javascript
复制
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
2. map

map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数:

代码语言:javascript
复制
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());
3. filter

filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串:

代码语言:javascript
复制
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
int count = strings.stream().filter(string -> string.isEmpty()).count();
4. limit

limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 10 条数据:

代码语言:javascript
复制
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
5. sorted

sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:

代码语言:javascript
复制
Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);
6. 并行(parallel)程序

parallelStream 是流并行处理程序的代替方法。以下实例我们使用 parallelStream 来输出空字符串的数量:

代码语言:javascript
复制
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
int count = strings.parallelStream().filter(string -> string.isEmpty()).count();

ParallelStream和Stream的区别就是支持并行执行,提高程序运行效率。但是如果使用不当可能会发生线程安全的问题,慎用

7. Collectors

Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:

代码语言:javascript
复制
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);
8. 统计

另外,一些产生统计结果的收集器也非常有用。它们主要用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。

代码语言:javascript
复制
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://blog.csdn.net/renfufei/article/details/24600507 http://www.runoob.com/java/java8-streams.html http://www.importnew.com/16436.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java从心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Lambda表达式
  • 语法
  • Lambda怎么用
    • 1. for循环遍历
      • 2. 代替匿名内部类
        • (1) lambdas 实现 Runnable 接口
        • (2) lambda进行集合排序
      • 二、Stream
        • 1. forEach
          • 2. map
            • 3. filter
              • 4. limit
                • 5. sorted
                  • 6. 并行(parallel)程序
                    • 7. Collectors
                      • 8. 统计
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档