《Java基础知识》Java Lambda表达式
接触Lambda表达式的时候,第一感觉就是,这个是啥?我居然看不懂,于是开始寻找资料,必须弄懂它。
先来看一个案例:
@FunctionalInterface
public interface MyLamda {
void test1(String y);
}
import demo.knowledgepoints.Lambda.inf.MyLamda;
public class LambdaTest {
public static void main(String[] args) {
MyLamda m = (y) ->{ System.out.println("ss"+y);};
m.test1("s");
}
}
运行结果:

非Lambda方式:
import demo.knowledgepoints.Lambda.inf.MyLamda;
public class MyLamdaIml implements MyLamda {
@Override
public void test1(String y) {
System.out.println("ss"+y);
}
public static void main(String[] args) {
MyLamdaIml myLamdaIml = new MyLamdaIml();
myLamdaIml.test1("s");
}
}
运行结果:

对比一下这两种方式:明显感觉使用Lambda表达式的更加简洁,由Java8引入,让我们一起来看看Lambda表达式的优点和不足。
1. Lambda表达式 语法:() -> {}; 通过上述案例我们看出,这个语法,就是替代了一个实现类和实现类中方法。
() 里面y为入参,{} 为方法体,类名被隐藏,方法名被隐藏。
2. Lambda表达式,接口(MyLamda)只能有且只有一个抽象方法。同时通过注解@FunctionalInterface可以做到编译的时候校验抽象方法,
不满足要求,给出编译报错。
3. (y) 可以写成 (String y), {}里面可以省略 return。并且当方法中只有一行代码时,{} 也可以省略 ;() 里面只有一个参数() 也可以省略,
最简写法 y -> System.out.println("ss"+y);
知道Lambda表达式的概念,就要结合实际情况来使用。
案例:
Java的Runable接口 有注解@FunctionalInterface。
@FunctionalInterface
public interface Runnable {
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}
于是:
public class LambdaTest {
public static void main(String[] args) {
Runnable runnable = () -> System.out.println("线程启动");
Thread thread = new Thread(runnable);
thread.start();
}
}
运行结果:

import java.util.Arrays;
import java.util.List; public class LambdaTest {
public static void main(String[] args) {
System.out.println("Java 8之前:---------------------------------------------");
List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
for (String feature : features) {
System.out.println(feature);
}
System.out.println("Java 8之后:---------------------------------------------");
List features1 = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
features1.forEach(n -> System.out.println(n));
System.out.println("使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示,看起来像C++的作用域解析运算符");
features1.forEach(System.out::println);
}
}
运行结果:

Java8引入函数式编程,还提供了一个强大的工具类: java.util.function,该类非常适合对集合数据做过滤操作。
案例:
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate; public class LambdaTest {
public static void main(String[] args) {
List<String> languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp"); System.out.println("第一个字符是J的字符串:");
filter(languages, (str)->str.startsWith("J")); System.out.println("最后一个字符是a的字符串:");
filter(languages, (str)->str.endsWith("a")); System.out.println("打印全部:");
filter(languages, (str)->true); System.out.println("都不打印:");
filter(languages, (str)->false); System.out.println("打印字符串长度超过4:");
filter(languages, (str)->str.length() > 4); } public static void filter(List<String> names, Predicate<String> condition) {
for(String name: names) {
if(condition.test(name)) {
System.out.print(name + " ");
}
}
System.out.println();
}
}
运行结果:

java.util.function.Predicate 允许将两个或更多的 Predicate 合成一个。它提供类似于逻辑操作符AND和OR的方法,名字叫做and()和or(),用于将传入 filter() 方法的条件合并起来。
案例:
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate; public class LambdaTest {
public static void main(String[] args) {
List<String> names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");
// 甚至可以用and()、or()逻辑函数来合并Predicate,
// 例如要找到所有以J开始,长度为四个字母的名字,你可以合并两个Predicate并传入
Predicate<String> startsWithJ = (n) -> n.startsWith("J");
Predicate<String> fourLetterLong = (n) -> n.length() == 4;
names.stream().filter(startsWithJ.and(fourLetterLong))
.forEach((n) -> System.out.print("字符串开头为“J” 且 字符长度等于4:" + n)); }
}
运行结果:

函数式编程概念map,改变元素值。
案例:
import java.util.Arrays;
import java.util.List; public class LambdaTest {
public static void main(String[] args) {
// 使用lambda表达式
List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
costBeforeTax.stream().map((cost) -> cost + .12*cost).forEach(n -> System.out.print(n+"; "));
System.out.println();
double bill = costBeforeTax.stream().map((cost) -> cost + .12*cost).reduce((sum, cost) -> sum + cost).get();
System.out.println("Total : " + bill);
}
}
运行结果:

案例:(filter 将满足条件的数据组成新的List)
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors; public class LambdaTest {
public static void main(String[] args) {
List<String> strList = Arrays.asList("abc","bcd","defg","jk");
List<String> filtered = strList.stream().filter(x -> x.length()> 2).collect(Collectors.toList());
System.out.printf("原List : %s, 新list : %s", strList, filtered);
}
}
运行结果:

案例:(map() 对元素进行转化,distinct() 方法来对集合进行去重)
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors; public class LambdaTest {
public static void main(String[] args) {
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); 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("原List : %s, 平方后的新List : %s", numbers, distinct);
}
}
运行结果:


案例:(最大,最小,和,平均)
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List; public class LambdaTest {
public static void main(String[] args) {
//获取数字的个数、最小值、最大值、总和以及平均值
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("List的最大值: " + stats.getMax());
System.out.println("List的最小值: " + stats.getMin());
System.out.println("List的之和: " + stats.getSum());
System.out.println("List的平均值: " + stats.getAverage());
} }
运行结果:

总结:
lambda表达式:
1. 简化代码。
2. 对集合操作方便。
缺点:
1. 局限强,不易进行复杂操作。
2. 调试不方便,出现问题,很难排查。
3. 数据量小,性能极差(慎用)。
参考:https://www.cnblogs.com/coprince/p/8692972.html
《Java基础知识》Java Lambda表达式的更多相关文章
- Java Lambda表达式初探
Java Lambda表达式初探 前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用 ...
- Java Lambda表达式入门
Java Lambda表达式入门 http://blog.csdn.net/renfufei/article/details/24600507 Java 8十个lambda表达式案例 http://w ...
- Java Lambda表达式入门[转]
原文链接: Start Using Java Lambda Expressions http://blog.csdn.net/renfufei/article/details/24600507 下载示 ...
- Java Lambda表达式教程与示例
Lambda表达式是Java 8中引入的一个新特性.一个lambda表达式是一个匿名函数,而且这个函数没有名称且不属于任何类.lambda表达式的概念最初是在LISP编程语言中引入的. Java La ...
- Java Lambda表达式forEach无法跳出循环的解决思路
Java Lambda表达式forEach无法跳出循环的解决思路 如果你使用过forEach方法来遍历集合,你会发现在lambda表达式中的return并不会终止循环,这是由于lambda的底层实现导 ...
- 「Flink」使用Java lambda表达式实现Flink WordCount
本篇我们将使用Java语言来实现Flink的单词统计. 代码开发 环境准备 导入Flink 1.9 pom依赖 <dependencies> <dependency> < ...
- java lambda表达式学习笔记
lambda是函数式编程(FP,functional program),在java8中引入,而C#很早之前就有了.在java中lambda表达式是'->',在C#中是‘=>’. 杜甫说:射 ...
- Java lambda 表达式常用示例
实体类 package com.lkb.java_lambda.dto; import lombok.Data; /** * @program: java_lambda * @description: ...
- Java lambda 表达式详解(JDK 8 新特性)
什么是 lambda 表达式 lambda 表达式(拉姆达表达式)是 JAVA 8 中提供的一种新的特性,它使 Java 也能进行简单的"函数式编程". lambda 表达式的本质 ...
随机推荐
- pycharm设置python脚本模板
PyCharm PyCharm是一个有名的Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Project管理.代码跳转.智能提示.自动完成 ...
- window系统下删除多余的引导
window系统下删除多余的引导 1.首先第一步进入EFI分区删除多余系统引导,只留下需要的引导 如何进入EFI分区 a)win 搜索框输入cm, 右键以管理员运行命令行 b)输入命令 diskpar ...
- Linux 命令记录
记录Linux下使用过的命令: Linux端 1.测试当前系统支持语言(我这用的是xshell,如果出现乱码,则在file-properties-terminal-encoding中,设置为utf-8 ...
- 最省钱的爬虫解决方案,比IP代理更划算
现状: 1.网上提供代理IP池的解决方案非常多,价格也有高有低,包天/月/年的都有,品质都要靠自己去尝试. 2.试过之后,发现成本相对高,每月要花200~300元, 所以希望研究一下是否有更性价比高的 ...
- 攻防世界 4-ReeHY-main
检查保护机制: 发现 可以好像写got 然后 程序流程 这里 有double free 然后 再发现 这里很有趣 ,要是我的content为零了 且size 小于112 那就从栈上copy一些内容 ...
- axios 请求二次封装
/** * 封装get方法 * @param url * @param data * @returns {Promise} */ export function get(url, params) { ...
- 剑指Offer-27.字符串的排列(C++/Java)
题目: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输入 ...
- Nginx-(四)基本模块2
nginx常用模块介绍(二) ngx_http_rewrite_module模块配置 (1) rewrite regex replacement [flag]; 将请求的url基于正则 ...
- win上找到host文件的方法
在运行的位置输入 C:\WINDOWS\system32\drivers\etc
- Server MyEclipse Tomcat v7.0 was unable to start within 45 seconds. If the server requires more time
启动Tomcat服务器时经常遇到这个错误, Server MyEclipse Tomcat v7.0 was unable to start within 45 seconds. If the ser ...