lambda表达式示例讲解

时间:2021-08-04 19:58:22

最近由于使用elasticsearch版本更新到5.0了,看到5.0版本源码中使用了很多的lambda表达式,于是就上网找资料简单研究一下,以下就通过代码示例来说明其用法,这也是最通俗易懂的表达方式了(个人对lambda表达式并不是很看好,确实能简化代码,但是后期不易于维护,调试起来也不方便):

它的基本语法为:参数 -> 表达式 或者 参数 -> 语句

1.使用lambda表达式对列表进行处理:

public class LambdaListTest {

public static void main(String[] args) {
List<String> lambdaList = new ArrayList<String>();
lambdaList.add("lbj");
lambdaList.add("wade");
lambdaList.add("paul");

//未使用lambda表达式的循环方式
for(String name : lambdaList){
System.out.println(name);
}

//使用lambda表达式的循环方式
lambdaList.forEach((name) -> System.out.println(name));
}

}

2.匿名内部类的lambda表达式使用:

public class LambdaAnonyTest {

public static void main(String[] args) {
//未使用lambda表达式的匿名内部类使用
Runnable run1 = new Runnable() {
@Override
public void run() {
System.out.println("未使用lambda表达式");
}
};
//使用lambda表达式的匿名内部类使用
Runnable run2 = () -> System.out.println("使用lambda表达式");

run1.run();
run2.run();
}

}

3.使用lambda表达式排序:

public class LambdaSortTest {

public static void main(String[] args) {
String[] sportsArr = {"basketball","swimming","running"};
//未使用lambda表达式排序
Arrays.sort(sportsArr, new Comparator<String>() {
@Override
public int compare(String arg0, String arg1) {
return arg0.compareTo(arg1);
}

});
//使用lambda表达式排序
Arrays.sort(sportsArr, ((String s1,String s2) -> (s1.compareTo(s2))));
}

}

4.使用lambda表达式的predicate过滤列表信息:

public class LambdaPredicateTest {

public static void main(String[] args) {
//使用lambda表达式的predicate过滤列表中符合条件的信息
//可以使用and过滤多个信息,也可以使用or
List<Integer> prediList = new ArrayList<Integer>();
prediList.add(21);
prediList.add(1);
prediList.add(22);

Predicate<Integer> stat1 = (num) -> num > 20;
Predicate<Integer> stat2 = (num) -> num < 30;

prediList.stream().filter(stat1.and(stat2)).forEach((num) -> System.out.println(num));
}

}

5.使用lambda的map方法进行数据计算:

public class LambdaMapTest {

public static void main(String[] args) {
List<Integer> salaryList = new ArrayList<Integer>();
salaryList.add(1000);
salaryList.add(1500);
salaryList.add(1200);
//未使用lambda表达式的map方法进行数据计算
for(int salary : salaryList){
double newSalary = salary + 0.2 * salary;
System.out.println(newSalary);
}
//使用lambda表达式的map方法进行数据计算
salaryList.stream().map((salary) -> salary + 0.2 * salary).forEach(System.out::println);
}

}

6.使用lambda的collect方法返回列表或者其他想要的信息:

public class LambdaCollectTest {

public static void main(String[] args) {
List<String> langList = new ArrayList<String>();
langList.add("java");
langList.add("php");
langList.add("c");
//利用lambda表达创建一个String列表
List<String> filterList = langList.stream().filter(lang -> lang.length() > 3).collect(Collectors.toList());
System.out.println(filterList);
//利用lambda表达式处理列表中的信息之后并且拼接
String upperStr = langList.stream().map(lang -> lang.toUpperCase()).collect(Collectors.joining("-"));
System.out.println(upperStr);
}

}

7.使用lambda计算最大,最小,平均值等等:

public class LambdaStatisticTest {
public static void main(String[] args) {
//使用lambda表达式计算集合中元素的最大值等等
List<Integer> testList = Arrays.asList(2,3,5,11,8,29,99);
IntSummaryStatistics stat = testList.stream().mapToInt((num) -> num).summaryStatistics();
System.out.println("max:" + stat.getMax());
System.out.println("min:" + stat.getMin());
System.out.println("sum:" + stat.getSum());
System.out.println("average:" + stat.getAverage());
}
}

总结:

lambda表达式确实使得代码简单清晰了很多,而且看起来也高大上了很多;但是由于lambda表达式是jdk1.8之后才引入的,而使用jdk1.8一起的版本的开发者还大有人在,所以个人感觉还没有完全普及,可读性不是很强,语法也相对比较复杂。

但是,不管如何lambda表达式也是jdk1.8的强大功能之一,作为java开发者,我们理应去研究下他,即使没有用到他。


欢迎大家一起交流技术。。