JDK1.8中Lambda表达式的应用

Labda表达式的介绍

Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正在将自己变的更高级,更人性化。我们甚至可以这么说lambda表达式其实就是实现SAM接口的语法糖。我们都知道在js中有闭包的概念,并且很好用,在java中有了Lambda表达式,我们也可以实现闭包的功能,将一个函数表达式作为函数参数使用。lambda写的好可以极大的减少代码冗余,同时可读性也好过冗长的内部类,匿名类。

Lambda表达式的基本语法是:
(Type1 param1, Type2 param2, …, TypeN paramN) -> {
statment1;
statment2;
//…
return statmentM;
}

Lambda表达式的使用条件是:
1).使用lambda表达式的类型必须是一个只含有一个抽象方法的借口
2).lambda只能使用final修饰的变量

之前我们想要将行为传入函数,仅有的选择就是匿名内部类。Java8发布以后,lambda表达式将大量替代匿名内部类的使用,简化代码的同时,更突出了原来匿名内部类中最重要的那部分包含真正逻辑的代码。尤其是对于做数据的同学来说,当习惯使用类似scala之类的函数式编程语言以后,体会将更加深刻。现在我们就来看看Java8中lambda表达式的一些常见写法。

1.forEach遍历Map

//1.forEach遍历Map
System.out.println("\n1.forEach遍历Map");
Map<String, Object> map = new HashMap<>();
map.put("key1", 11);
map.put("key2", 12);
map.put("key3", 13);
map.put("key4", 14);
map.forEach((key,value)->{
	System.out.println("key:"+key+",value:"+value);
});

输出:
1.forEach遍历Map
key:key1,value:11
key:key2,value:12
key:key3,value:13
key:key4,value:14

2.forEach遍历List

//2.forEach遍历List
System.out.println("\n2.forEach遍历List");
List<Integer> list =  new ArrayList<Integer>() ;
list.add(1);
list.add(2);
list.add(3);
list.forEach(value->System.out.println(value));

输出:
2.forEach遍历List
1
2
3

3.在多线程中使用Lambda表达式

//3.在多线程中使用Lambda表达式
System.out.println("\n3.在多线程中使用Lambda表达式");
new Thread(()->System.out.println("new Thread start")).start(); 

输出:
3.在多线程中使用Lambda表达式
new Thread start

4.自定义Lambda表达式功能

//4.自定义Lambda表达式功能
interface MathOperator{
	int operator(int a, int b);
	
}
public static void calc(int a ,int b, MathOperator operator){
	System.out.println(operator.operator(a, b));
}

System.out.println("\n4.自定义Lambda表达式功能");
MathOperator add = (a,b)->a+b ;
MathOperator sub = (a,b)->a-b ;
MathOperator mul = (a,b)->a*b ;
MathOperator div = (a,b)->a/b ;

calc(3, 5, add);
calc(3, 5, sub);
calc(3, 5, mul);
calc(3, 5, div);

输出:
4.自定义Lambda表达式功能
8
-2
15
0

5.Predicate接口实现数据过滤

System.out.println("\n5.Predicate接口实现数据过滤");
List<String> filterList = new LinkedList<>() ;
filterList.add("1");
filterList.add("abc");
filterList.add("java");
filterList.add("python2");
filterList.add("python3");
filterList.add("c++");
filture(filterList, str->str.startsWith("j")) ;
//单条件过滤
filterList.stream().filter(str->str.contains("++")).forEach(value->System.out.println(value)) ;
//多条件逻辑过滤
Predicate<String> startWith = str->str.startsWith("p") ;
filterList.stream().filter(startWith.and(str->str.contains("2"))).forEach(value-								  >System.out.println(value)) ;

输出:
5.Predicate接口实现数据过滤
java
c++
python2

6.Lambda的map和reduce操作

//3.在多线程中使用Lambda表达式
System.out.println("\n6.Lambda的map和reduce操作");
List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
//map操作让每一个元素加上它之前的0.12倍
costBeforeTax.stream().map(cost -> cost+0.12*cost).forEach(System.out::println);
System.out.println(costBeforeTax.stream().reduce((sum,cost)->sum+cost).get()); //求和

输出:
6.Lambda的map和reduce操作
112.0
224.0
336.0
448.0
560.0
1500

7.创建一个字符串列表,每个字符串长度大于2

System.out.println("\n7.创建一个字符串列表,每个字符串长度大于2");
List<String> strList = Arrays.asList(new String[]{"abc","de","abcde"});
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);

输出:
7.创建一个字符串列表,每个字符串长度大于2
Original List : [abc, de, abcde], filtered list : [abc, abcde]

8.获取数字的个数、最小值、最大值、总和以及平均值

System.out.println("\n8.获取数字的个数、最小值、最大值、总和以及平均值");
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());

输出:
8.获取数字的个数、最小值、最大值、总和以及平均值
Highest prime number in List : 29
Lowest prime number in List : 2
Sum of all prime numbers : 129
Average of all prime numbers : 12.9

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值