Java 8十个lambda表达式案例
2015-07-07 17:25
543 查看
Java 8十个lambda表达式案例
1. 实现Runnable线程案例
使用() -> {} 替代匿名类://Before Java 8:new Thread(new Runnable() { @Override public void run() { System.out.println("Before Java8 "); } }).start();//Java 8 way:new Thread( () -> System.out.println("In Java8!") ).start(); Output:too much code, for too little to doLambda expression rocks !!你可以使用 下面语法实现Lambda:(params) -> expression
(params) -> statement
(params) -> { statements }如果你的方法并不改变任何方法参数,比如只是输出,那么可以简写如下:() -> System.out.println("Hello Lambda Expressions");
如果你的方法接受两个方法参数,如下:(int even, int odd) -> even + odd
2.实现事件处理
如果你曾经做过Swing 编程,你将永远不会忘记编写事件侦听器代码。使用lambda表达式如下所示写出更好的事件侦听器的代码。// Before Java 8:JButton show = new JButton("Show"); show.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("without lambda expression is boring"); } });// Java 8 way:show.addActionListener((e) -> { System.out.println("Action !! Lambda expressions Rocks"); });在java 8中你可以使用Lambda表达式替代丑陋的匿名类。
3.使用Lambda表达式遍历List集合
features .asList(, , , ); ( feature ) { .out.println(feature); } features .asList(, , , ); features.forEach(n -> .out.println(n));features.forEach(.out::println); and方法引用是使用两个冒号::这个操作符号。
4.使用Lambda表达式和函数接口
为了支持函数编程,Java 8加入了一个新的包java.util.function,其中有一个接口java.util.function.Predicate是支持Lambda函数编程:(args[]){ List languages = Arrays.(, , , , ); System..(); filter(languages, (str)->str.()); System..(); filter(languages, (str)->str.()); System..(); filter(languages, (str)->); System..(); filter(languages, (str)->); System..(); filter(languages, (str)->str.() > ); } (List names, Predicate condition) { (String names) { (condition.(name)) { System..(name + ); } } } }Languages which starts with J : Java Languages which ends with a Java Scala Print all languages : Java Scala C++ Haskell Lisp Print no language : Print language whose length greater than : Scala Haskell (List names, Predicate condition) { names.().((name) -> (condition.(name))) .((name) -> {System..(name + ); }); }你能看到来自Stream API 的filter方法能够接受 Predicate参数, 能够允许测试多个条件。
5.复杂的结合Predicate 使用
java.util.function.Predicate提供and(), or() 和 xor()可以进行逻辑操作,比如为了得到一串字符串中以"J"开头的4个长度:<> startsWithJ (n) -> n.startsWith(); <> fourLetterLong (n) -> n.length() == ; names.stream() .filter(startsWithJ.(fourLetterLong)) .forEach((n) -> .out.print( + n));其中startsWithJ.and(fourLetterLong)是使用了AND逻辑操作。
6.使用Lambda实现Map 和 Reduce
最流行的函数编程概念是map,它允许你改变你的对象,在这个案例中,我们将costBeforeTeax集合中每个元素改变了增加一定的数值,我们将Lambda表达式 x -> x*x传送map()方法,这将应用到stream中所有元素。然后我们使用 forEach() 打印出这个集合的元素.costBeforeTax .asList(, , , , ); ( cost ) { double price cost + .*cost; .out.println(price); } costBeforeTax .asList(, , , , ); costBeforeTax.stream().map((cost) -> cost + .*cost) .forEach(.out::println);reduce() 是将集合中所有值结合进一个,Reduce类似SQL语句中的sum(), avg() 或count(),
// Applying 12% VAT on each purchase// Old way:List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500); double total = 0;for (Integer cost : costBeforeTax) { double price = cost + .12*cost; total = total + price; }System.out.println("Total : " + total);// New way:List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500); double bill = costBeforeTax.stream().map((cost) -> cost + .12*cost) .reduce((sum, cost) -> sum + cost) .get();System.out.println("Total : " + bill);OutputTotal : 1680.0Total : 1680.0
7.通过filtering 创建一个字符串String的集合
Filtering是对大型Collection操作的一个通用操作,Stream提供filter()方法,接受一个Predicate对象,意味着你能传送lambda表达式作为一个过滤逻辑进入这个方法:<> filtered strList.stream().filter(x -> x.length()> ) .collect(.toList());.out.printf(, strList, filtered); [, , , , , ], filtered list , bcd, defg
8.对集合中每个元素应用函数
我们经常需要对集合中元素运用一定的功能,如表中的每个元素乘以或除以一个值等等.<> G7 .asList(, , , , , ,); G7Countries G7.stream().map(x -> x.toUpperCase()) .collect(.joining());.out.println(G7Countries); , , , , , U.K.,上面是将字符串转换为大写,然后使用逗号串起来。
9.通过复制不同的值创建一个子列表
使用Stream的distinct()方法过滤集合中重复元素。<> numbers .asList(, , , , , , );<> distinct numbers.stream().map( i -> i*i).distinct() .collect(.toList());.out.printf(, numbers, distinct); [, , , , , , ], duplicates , , , ,
10.计算List中的元素的最大值,最小值,总和及平均值
<> primes .asList(, , , , , , , , , ); stats primes.stream().mapToInt((x) -> x) .summaryStatistics();.out.println( + stats.getMax());.out.println( + stats.getMin());.out.println( + stats.getSum());.out.println( + stats.getAverage());
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统