Java8出来已经4年,但仍是有不少人用上了jdk8,但并没用到里面的新东西,那不就等于没用?jdk8有许多的新特性,详细可看下面脑图html
我只讲两个最重要的特性Lambda和Stram,配合起来用能够极大提升生产力,写出高效率、干净、简洁的代码。java
Lambda 容许把函数做为一个方法的参数(函数做为参数传递进方法中)。express
lambda 表达式的语法格式以下:数组
(parameters) -> expression或(parameters) ->{ statements; }
下面是Java 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)
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);
// 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();
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,能够像SQL同样操做数据。
可操做的数据有集合,数组,I/O channel, 产生器generator 等。dom
Sream的主要使用方式ide
'forEach' 来迭代流中的每一个数据。如下代码片断使用 forEach 输出了10个随机数:函数
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);
map 方法用于映射每一个元素到对应的结果,如下代码片断使用 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 方法过滤出空字符串:spa
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); // 获取空字符串的数量 int count = strings.stream().filter(string -> string.isEmpty()).count();
limit 方法用于获取指定数量的流。 如下代码片断使用 limit 方法打印出 10 条数据:
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);
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();
ParallelStream和Stream的区别就是支持并行执行,提升程序运行效率。可是若是使用不当可能会发生线程安全的问题,慎用
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://blog.csdn.net/renfufe...
http://www.runoob.com/java/ja...
http://www.importnew.com/1643...
坚持日更:34天
您的点赞、转发是对我最大的支持!
THANDKS
一个立志成大腿而天天努力奋斗的年轻人
伴学习伴成长,成长之路你并不孤单!
![扫描二维码,关注公众号
](http://upload-images.jianshu....