《剖析Java8的lamda表达式03》
前面几个章节笔者对lamda表达式的语法进行了详细的讲解,那么本章也是最后一章,一来是做一些总结,但更多是lamda表达式的一些实战性相关的案例,毕竟清楚语法,不清楚怎么用,在哪里用,将会是一个很悲催的事情。
先来首先来看看一个排序操作,比如我们想对一个List集合执行字典排序,那么Java8之前最常见的做法就是编写匿名类,当然我们既然已经学习了lamda,就应该学而用之:
List<Double> list = Arrays.asList(3.5D, 2.7D, 1.65D); /* 使用匿名类进行字典排序 */ Collections.sort(list, new Comparator<Double>() { @Override public int compare(Double a, Double b) { return a.compareTo(b); } }); System.out.println(list); /* 使用lamda表达式进行排序 */ Collections.sort(list, (a, b) -> a.compareTo(b)); System.out.println(list); Collections.sort(list, (a, b) -> { return b.compareTo(a); }); Collections.sort(list, Comparable::compareTo); System.out.println(list);
之前笔者曾经以及过,Java8为大家提供了Predicate、consumer、Funtion等函数式接口,那么接下来,笔者就统一对其进行演示:
/* 支持布尔类型表达式的Predicate函数式接口 */ Predicate<String> predicate = (str) -> str.isEmpty(); System.out.println(predicate.test("JohnGao")); predicate = (str) -> str.startsWith("J"); System.out.println(predicate.test("JohnGao"));
/* 支持将入参信息映射到出参的Function函数式接口 */ Function<String, Integer> function = (str) -> Integer.valueOf(str); System.out.println(function.apply("123")); function = Integer::valueOf; System.out.println(function.apply("321")); function = (str) -> { int result = -1; if (str.matches("[0-9]+")) { result = Integer.valueOf(str); } return result; }; System.out.println(function.apply("test123"));
/* 无返回值的consumer函数式接口 */ Consumer<String> consumer = System.out::println; consumer.accept("lamda"); Consumer<List<Integer>> consumer2 = (list) -> { list.forEach((Integer i) -> { if (i % 2 == 0) System.out.println(i); }); }; consumer2.accept(Arrays.asList(1, 3, 5, 7, 9, 8, 10, 20));
Java5的API中为大家带来了for-each语法,简化了数组、集合的迭代操作,但Java8对集合类型提供有forEach()函数,让大家可以更专注于业务:
List<String> list = Arrays.asList("a", "b", "c"); /* java5之前的迭代方式 */ for (int i = 0; i < list.size(); i++) System.out.println(list.get(i)); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) System.out.println(iterator.next()); for (iterator = list.iterator(); iterator.hasNext();) { System.out.println(iterator.next()); }
/* java5之后的foreach迭代方式 */ for (String str : list) System.out.println(str);
/* java8后结合lamda表达式迭代方式 */ list.forEach(!list.isEmpty() ? System.out::println : null); list.forEach((str) -> System.out.println(str)); Map<String, String> map = new HashMap<String, String>(); for (int i = 1; i <= 10; i++) map.put("key" + i, "value" + i); map.forEach((str1, str2) -> { System.out.println(str2); });
这里有个有趣的案例,在java8之前,我们对集合中元素求和、最大值、最小值,一直采用的是比较蛋疼的写法,但结合lamda表达式和函数式编程,将会变得有趣:
List<Integer> list = Arrays.asList(1, 12, 45, 78, 100, 500); int max = list.get(0); int min = max; /* 早期求最大值和最小值写法 */ for (Integer i : list) { max = max < i ? max = i : max; min = min > i ? min = i : min; } System.out.println("min-->" + min + "\nmax-->" + max);
/* 结合流lamda表达式 */ IntSummaryStatistics stats = list.stream().mapToInt(Integer::new).summaryStatistics(); System.out.println("sum-->" + stats.getSum() + "\navg-->" + stats.getAverage() + "\nmax-->" + stats.getMax() + "\nmin-->" + stats.getMin() + "\ncount-->" + stats.getCount());
相关推荐
本课程主要针对于Java 8(JDK 1.8)的新特性Lamda表达式进行了全面讲解。讲解了java基于函数编程的语法,以及与Lamda表达式操作有关的内建接口、批处理、MapReduce数据分析汇总处理。
从Java 8开始,可以直接使用Lamda表达式创建Callable对象。 2. 使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。 3. 使用FutureTask对象作为Thread对象的target...
Lambda表达式是Java 8中的一个关键特性,它允许开发者以一种更简洁、更函数式的方式来编写代码。传统的匿名内部类在处理简短的、无状态的代码块时显得冗余,而Lambda表达式则解决了这个问题。Lambda表达式由三部分...
在第二版中,作者可能增加了对Java 8及后续版本新特性的讨论,比如流API在处理集合数据时的应用,以及lamda表达式如何简化函数式编程。同时,随着大数据和云计算的发展,可能会涉及分布式数据结构和并行算法等内容,...
此应用程序使用 DropWizard 并需要 Java 8(由于流/lamda 表达式) 目前的分析器是: IdentityAnalyzer:返回未更改的输入文本。 SummaryAnalyzer:计算输入文本中的字符和单词。 DollarWordAnalyzer:识别字符...
在这个过程中,我们可以使用Java 8中引入的Lambda表达式来实现数据的转换。 为什么需要Java Lambda List转Map? 在实际开发中,我们经常需要对List列表中的数据进行过滤处理,并将有用的数据存放到Map中。例如,在...
6. **函数式编程**:了解Python中的高阶函数,如map、filter、reduce,以及lamda表达式和闭包的概念。 7. **集合操作**:理解集合的独特性质,如无序、不重复,以及集合之间的操作,如并集、交集和差集。 8. **...
由于引入了匿名函数和Lamda表达式,函数式编程可以写出极其简洁的代码。例如,要将集合A中的所有元素加上3并放到集合B中,通过一行代码就可以实现:B=A.map(x=>x+3)。这里的map函数相当于数学上的函数f,它是一个...