Java8新特性之Lambda表达式
Java8新特性之Lambda表达式
- Lambda表达式
- 概念介绍
- 处理方式
- 语法格式
- 常用12大表达式案例
- 1.实现Runnable线程案例
- 2.实现事件处理
- 3.遍历List集合
- 4.根据List中某个对象取值排序
- 5.使用Lambda表达式和函数接口
- 6.复杂的结合Predicate使用
- 7.使用Lambda实现Map
- 8.使用Lambda实现Reduce
- 9.通过filtering 创建一个字符串String的集合
- 10.对集合中每个元素应用函数
- 11.通过复制不同的值创建一个子列表
- 12.计算List中的元素的最大值,最小值,总和及平均值
Lambda表达式
概念介绍
Lambda表达式实质上等同于一个匿名方法,该方法并非独立执行,而是用于实现由函数式接口定义的唯一抽象方法
处理方式
Lambda表达式将函数当成参数传递给某个方法,或者把代码本身当作数据处理。
使用Lambda表达式时,会创建实现了函数式接口的一个匿名类实例,可以将Lambda表达式视为一个对象,可以将其作为参数传递
语法格式
-
() -> {}
(): 括号就是接口方法的括号(接口方法如果有参数,也需要写参数。只有一个参数时,括号可以省略)
-> : 分割左右部分
{} : 要实现的方法体(只有一行代码时,可以不加括号,可以不写return)
-
常用方式
(params) -> expression
(params) -> statement
(params) -> { statements }
-
方法引用
:: : 使用两个冒号::这个操作符号
常用12大表达式案例
1.实现Runnable线程案例
-
Before Java 8
new Thread(new Runnable() { @Override public void run() { System.out.println("Before Java8 "); } }).start();
-
After Java 8
new Thread( () -> System.out.println("In Java8!") ).start();
2.实现事件处理
-
特性介绍
Swing编程,编写事件侦听器代码
-
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"); } });
-
After Java 8
show.addActionListener((e) ->{ System.out.println("Lambda expressions Rocks"); });
3.遍历List集合
-
Before Java 8
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API"); for (String feature : features) { System.out.println(feature); }
-
After Java 8
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API"); features.forEach(feature -> { if (feature.toString().contains("e")) { System.out.println(feature); } }); // Even better use Method reference feature of Java 8 // method reference is denoted by :: (double colon) operator // looks similar to score resolution operator of C++ features.forEach(System.out::println); //Lambda 本质上市匿名内部类的改装,所以它使用到的变量都会隐式的转成final String separator = "|"; features.forEach(feature -> System.out.print(feature + separator) ); //等价于 final String separator = "|"; features.forEach(feature -> System.out.print(feature + separator) );
4.根据List中某个对象取值排序
-
Before Java 8
List<Integer> list = Arrays.asList(3,1,9,6); //写法一 Collections.sort(list, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1.compareTo(o2);//升序 } }); //写法二 list.sort(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { //return o1 - o2; return o1.compareTo(o2);//升序 } });
-
After Java 8
//Lambda的返回值和参数类型由编译器推理得出,不需要显示定义,如果只有一行代码可以不用写return语句 List<Integer> list = Arrays.asList(3,1,9,6); list.sort((e1,e2) -> e1.compareTo(e2));
5.使用Lambda表达式和函数接口
-
特性介绍
Java 8加入了一个新包java.util.function,其中接口java.util.function.Predicate是支持Lambda函数编程 -
案例代码
public static void filter(List<String> names, Predicate condition) { for(String name: names) { if(condition.test(name)) { System.out.println(name + " "); } } } //Even better <!-- Stream API 的filter方法能够接受 Predicate参数, 能够允许测试多个条件 --> public static void filter(List names, Predicate condition) { names.stream().filter((name) -> (condition.test(name))) .forEach((name) -> { System.out.println(name + " "); }); } public static void main(String[] args) { List languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp"); System.out.println("Languages which starts with J :"); filter(languages, (str)->str.toString().startsWith("J")); }
6.复杂的结合Predicate使用
-
特性介绍
java.util.function.Predicate提供and(), or() 和 xor()可以进行逻辑操作
-
案例代码
Predicate<String> startsWithJ = (n) -> n.startsWith("J"); Predicate<String> fourLetterLong = (n) -> n.length() == 4; //其中startsWithJ.and(fourLetterLong)是使用了AND逻辑操作 languages.stream() .filter(startsWithJ.and(fourLetterLong)) .forEach((n) -> System.out.print("Name, which starts with " + "'J' and four letter long is : " + n)); //测试发现,and中fourLetterLong的并为起到控制作用,欢迎大佬指点
7.使用Lambda实现Map
-
特性介绍
最流行的函数编程概念是map,它允许你改变你的对象,在这个案例中,我们将costBeforeTeax集合中每个元素改变了增加一定的数值,我们将Lambda表达式 x -> x*x传送map()方法,这将应用到stream中所有元素。 -
Before Java 8
// applying 12% VAT on each purchase // Without lambda expressions: List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500); for (Integer cost : costBeforeTax) { double price = cost + .12*cost; System.out.println(price); }
-
After Java 8
List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500); costBeforeTax.stream().map((cost) -> cost + .12*cost) .forEach(System.out::println);
8.使用Lambda实现Reduce
-
特性介绍
reduce() 是将集合中所有值结合进一个,Reduce类似SQL语句中的sum(), avg() 或count()
-
Before Java 8
// Applying 12% VAT on each purchase // Old way: List<Integer> 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);
-
After Java 8
// New way: List<Integer> 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);
9.通过filtering 创建一个字符串String的集合
-
特性介绍
Filtering是对大型Collection操作的一个通用操作,Stream提供filter()方法,接受一个Predicate对象,意味着你能传送lambda表达式作为一个过滤逻辑进入这个方法
-
案例代码
// Create a List with String more than 2 characters List<String> strList = Arrays.asList("ags","sffs",",","dsfa","dsfa","ees","sdfdask"); List<String> filtered = strList.stream().filter(x -> x.length()> 2) .collect(Collectors.toList()); System.out.printf("Original List : %s, filtered list : %s %n", strList, filtered);
10.对集合中每个元素应用函数
-
特性介绍
对集合中元素运用一定的功能,如表中的每个元素乘以或除以一个值等等 -
案例代码
// Convert String to Uppercase and join them using coma List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy", "U.K.","Canada"); String G7Countries = G7.stream().map(x -> x.toUpperCase()) .collect(Collectors.joining("|")); System.out.println(G7Countries);
11.通过复制不同的值创建一个子列表
-
特性介绍
使用Stream的distinct()方法过滤集合中重复元素
-
案例代码
// Create List of square of all distinct numbers List<Integer> numbers = Arrays.asList(9, 10, 3, 4, 7, 3, 4); List<Integer> distinct = numbers.stream().map( i -> i*i).distinct() .collect(Collectors.toList()); System.out.printf("Original List : %s, Square Without duplicates : " + "%s %n", numbers, distinct);
12.计算List中的元素的最大值,最小值,总和及平均值
-
特性介绍
计算List中的元素的最大值,最小值,总和及平均值 -
After Java 8
//Get count, min, max, sum, and average for numbers List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29); IntSummaryStatistics stats = primes.stream().mapToInt((x) -> x) .summaryStatistics(); System.out.println("Highest prime number in List : " + stats.getMax()); System.out.println("Lowest prime number in List : " + stats.getMin()); System.out.println("Sum of all prime numbers : " + stats.getSum()); System.out.println("Average of all prime numbers : " + stats.getAverage());
参考链接
https://www.jdon.com/idea/java/10-example-of-lambda-expressions-in-java8.html
- 点赞
- 收藏
- 分享
- 文章举报
- java8新特性之lambda表达式(一)
- Java8新特性之Lambda表达式
- Java 8新特性:新语法方法引用和Lambda表达式及全新的Stream API
- Java 8 新特性(一)lambda表达式
- Java 8的新特性(含Lambda表达式)
- Java8新特性Lambda表达式
- 初看Java8新特性-Lambda表达式的语法规则
- java8 新特性-Lambda 表达式
- 好程序员分享java8新特性之Lambda表达式
- javaSE_8系列博客——Java语言的特性(三)--类和对象(20)--嵌套类(Lambda 表达式--VS--方法引用)
- Java8特性详解 lambda表达式 Stream
- JAVA8新特性(Lambda 表达式)
- Java8新特性之 Lambda表达式
- 小司机带你用Java新特性之Lambda表达式
- Java8新特性Lambda表达式、函数式接口
- JAVA8 新特性之lambda表达式
- Java8特性详解 lambda表达式 Stream
- java1.8 新特性 - Lambda表达式
- java8新特性(二)_lambda表达式
- Java8特性详解 lambda表达式 Stream