lambda表达式示例讲解

来源:互联网 发布:linux 查看系统log 编辑:程序博客网 时间:2024/04/29 04:50

最近由于使用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() {@Overridepublic 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>() {@Overridepublic 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过滤多个信息,也可以使用orList<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开发者,我们理应去研究下他,即使没有用到他。


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

1 0