Lambda表达式和方法引用
1 , 为什么用lambda表达式
将重复固定的代码写法简单化
2 ,lambda表达式的实质
对函数式接口的实现(一个接口中只有一个抽象方法的接口被称为函数式接口)
package com.moreas.lambda; public class Employee { private String name; private int age; private double salary; public Employee(String name, int age, double salary) {
super();
this.name = name;
this.age = age;
this.salary = salary;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public double getSalary() {
return salary;
} public void setSalary(double salary) {
this.salary = salary;
} }
函数式接口
package com.moreas.lambda;
public interface MyPredicate<T> { public boolean test(T t); }
package com.moreas.lambda; import java.util.ArrayList;
import java.util.List; public class Client { public List<Employee> filterEmployee(List<Employee> list, MyPredicate<Employee> mp) {
List<Employee> emps = new ArrayList<>();
for (Employee employee : list) {
if (mp.test(employee)) {
emps.add(employee);
}
}
return emps;
} public static void main(String[] args) {
//new Client().test();
new Client().test1();
} public void test() { List<Employee> employees = new ArrayList<>();
employees.add( new Employee("zhangsan1", 16, 1500));
employees.add( new Employee("zhangsan2", 16, 300));
employees.add( new Employee("zhangsan3", 16, 400));
employees.add( new Employee("zhangsan4", 16, 1200)); List<Employee> list = filterEmployee(employees, new MyPredicate<Employee>() { @Override
public boolean test(Employee t) {
// TODO Auto-generated method stub
return t.getSalary() <= 500;
}
}); for (Employee employee : list) {
System.out.println(employee.getName());
}
} public void test1() {
List<Employee> employees = new ArrayList<>();
employees.add( new Employee("zhangsan1", 16, 1500));
employees.add( new Employee("zhangsan2", 16, 300));
employees.add( new Employee("zhangsan3", 16, 400));
employees.add( new Employee("zhangsan4", 16, 1200));
List<Employee> list = filterEmployee(employees, (e) -> e.getSalary() <= 500);
list.forEach(x -> System.out.println(x.getName()));
}
}
lambda 表达式子的几种形式
一 无参数 ,无返回值
Runnable r1 = () -> System.out.println("Hello Lambda!");
r1.run();
二 有一个参数 ,无返回值
Consumer<String> con = ( x ) -> System.out.println(x);
con.accept("hello world!");
三 有多个参数 ,有返回值
Comparator<Integer> com = (x, y) -> {
System.out.println("函数式接口");
return Integer.compare(x, y);
};
四 有多个参数, lambda体中只有一句话,return 和大括号可以省略
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
四个核心的函数式接口
//Consumer<T> 消费型接口 :
@Test
public void test1(){
happy(, (m) -> System.out.println("吃个饭,消费了:" + m + "元"));
} public void happy(double money, Consumer<Double> con){
con.accept(money);
}
//Supplier<T> 供给型接口 :
@Test
public void test2(){
List<Integer> numList = getNumList(10, () -> (int)(Math.random() * 100)); for (Integer num : numList) {
System.out.println(num);
}
} //需求:产生指定个数的整数,并放入集合中
public List<Integer> getNumList(int num, Supplier<Integer> sup){
List<Integer> list = new ArrayList<>(); for (int i = 0; i < num; i++) {
Integer n = sup.get();
list.add(n);
} return list;
}
@Test
public void test3(){
String newStr = strHandler("\t\t\t hello world ", (str) -> str.trim());
System.out.println(newStr); String subStr = strHandler("hello world", (str) -> str.substring(, ));
System.out.println(subStr);
} //需求:用于处理字符串
public String strHandler(String str, Function<String, String> fun){
return fun.apply(str);
}
//Predicate<T> 断言型接口:
@Test
public void test4(){
List<String> list = Arrays.asList("Hello", "world", "Lambda", "ok");
List<String> strList = filterStr(list, (s) -> s.length() > );
for (String str : strList) {
System.out.println(str);
}
} //需求:将满足条件的字符串,放入集合中
public List<String> filterStr(List<String> list, Predicate<String> pre){
List<String> strList = new ArrayList<>();
for (String str : list) {
if(pre.test(str)){
strList.add(str);
}
}
return strList;
}
方法引用
引用静态方法:Class::staticMethodName
引用某个对象的实例方法:object::instanceMethodName
引用某个类型的任意对象的实例方法:Class::instancemethodName
引用构造方法:ClassName::new
//对象 :: 实例方法名
@Test
public void test1(){
// 实例方法的参数和返回值类型与函数式接口中抽象方法的参数和返回值类型相同
Consumer<String> con3 = System.out::println;
con3.accept("Hello Java8!");
}
//类名 :: 静态方法名
@Test
public void test4(){ Comparator<Integer> com2 = Integer::compare;
}
//类名 :: 实例方法名
@Test
public void test9(){
//可以这样写的前提是,第一个参数是方法的调用者,第二个参数是方法的传参
BiPredicate<String, String> bp = String::equals;
}
//构造器引用
@Test
public void test7(){
//匹配无参构造器
Supplier<Employee> sup2 = Employee::new;
Employee em = sup2.get(); //匹配一个参数的构造器
Function<String, Employee> fun = Employee::new;
Employee em2 = fun.apply("zhangsan"); }
//数组引用
@Test
public void test8(){
Function<Integer, String[]> fun = (x) -> new String[x];
String[] strs = fun.apply(); System.out.println("--------------------------");
Function<Integer, String[]> fun2 = String[]::new;
String[] strs2 = fun2.apply(); System.out.println("--------------------------");
Function<Integer, Employee[]> fun3 = Employee[] :: new;
Employee[] emps = fun3.apply();
}
public class Person { private String name; private Integer age; public Person(String name, Integer age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public static int compareByAge(Person a, Person b) {
return a.age.compareTo(b.age);
} public static void main(String[] args) {
//没有使用Lambda表达式
//test1(); //使用Lambda表达式
// test2(); //使用静态方法引用
test3(); //实例方法引用
test4(); } public static void test1() {
Person[] persons = new Person[]{new Person("ZhangSan", ), new Person("LiSi", ), new Person("WangWu", )};
class PersonAgeComparator implements Comparator<Person> {
public int compare(Person a, Person b) {
return a.getAge().compareTo(b.getAge());
}
}
Arrays.sort(persons, new PersonAgeComparator());
Arrays.stream(persons).forEach(x -> System.out.println(x.getName()));
} public static void test2() {
Person[] persons = new Person[]{new Person("ZhangSan", ), new Person("LiSi", ), new Person("WangWu", )};
class PersonAgeComparator implements Comparator<Person> {
public int compare(Person a, Person b) {
return a.getAge().compareTo(b.getAge());
}
}
//第二个参数就是Comparator是一个函数式接口,可以传入一个Lambda表达式
Arrays.sort(persons, (a,b)->{
if(a.getAge() < b.getAge()){
return -;
}
if(a.getAge() == b.getAge()){
return ;
}
return ;
});
Arrays.stream(persons).forEach(x -> System.out.println(x.getName()));
} public static void test3() {
Person[] persons = new Person[]{new Person("ZhangSan", ), new Person("LiSi", ), new Person("WangWu", )};
class PersonAgeComparator implements Comparator<Person> {
public int compare(Person a, Person b) {
return a.getAge().compareTo(b.getAge());
}
}
//能够这样写的原因是Person的静态方法compareByAge的参数和返回值类型和Lambda保持一致
Arrays.sort(persons, Person::compareByAge);
Arrays.stream(persons).forEach(x -> System.out.println(x.getName()));
} public static void test4(){ Person person = new Person("ZhangSan", );
//Lambda表达式
Supplier<String> supplier = ()-> { return person.getName();};
System.out.println(supplier.get()); //实例方法引用
supplier = person::getName;
System.out.println(supplier.get());
}
}
Lambda表达式和方法引用的更多相关文章
- JAVA8之Lambda表达式与方法引用表达式
一.Lambda表达式 基本语法: lambdaParameters->lambdaBody lambdaParameters传递参数,lambdaBody用于编写逻辑,lambda表达式会生成 ...
- java8的新特性之lambda表达式和方法引用
1.1. Lambda表达式 通过具体的实例去体会lambda表达式对于我们代码的简化,其实我们不去深究他的底层原理和背景,仅仅从用法上去理解,关注两方面: lambda表达式是Java8的一个语法糖 ...
- Java函数式编程:一、函数式接口,lambda表达式和方法引用
Java函数式编程 什么是函数式编程 通过整合现有代码来产生新的功能,而不是从零开始编写所有内容,由此我们会得到更加可靠的代码,并获得更高的效率 我们可以这样理解:面向对象编程抽象数据,函数式编程抽象 ...
- java8 探讨与分析匿名内部类、lambda表达式、方法引用的底层实现
问题解决思路:查看编译生成的字节码文件 目录 测试匿名内部类的实现 小结 测试lambda表达式 小结 测试方法引用 小结 三种实现方式的总结 对于lambda表达式,为什么java8要这样做? 理论 ...
- Java 8 Lambda表达式之方法引用 ::双冒号操作符
双冒号运算符就是java中的方法引用,方法引用的格式是类名::方法名. 这里只是方法名,方法名的后面没有括号“()”.--------> 这样的式子并不代表一定会调用这个方法.这种式子一般是用作 ...
- Java提升二:Lambda表达式与方法引用
1.Lambda表达式 1.1.定义 lambda表达式是对于函数式接口(只含有一个抽象方法的接口)的简洁实现方式.它与匿名内部类的作用相似,但是就使用范围而言,匿名内部类更为广泛,而lambda表达 ...
- 一文带你深入了解 Lambda 表达式和方法引用
前言 尽管目前很多公司已经使用 Java8 作为项目开发语言,但是仍然有一部分开发者只是将其设置到 pom 文件中,并未真正开始使用.而项目中如果有8新特性的写法,例如λ表达式.也只是 Idea Al ...
- lambda表达式之方法引用
/** * 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器.<br> * 与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码. ...
- Java 8-Lambda表达式、方法引用、标准函数接口与流操作、管道操作之间的关系
1.Lambda表达式与接口之间的关系 只要Lambda表达式的声明形式与接口相一致,在很多情况下都可以替换接口.见如下代码 Thread t1 = new Thread(new Runnable() ...
随机推荐
- springboot启动报错,Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
报错: Error starting ApplicationContext. To display the conditions report re-run your application with ...
- js中this绑定方式及如何改变this指向
this的绑定方式基本有以下几种: 隐式绑定 显式绑定 new 绑定 window 绑定 箭头函数绑定 隐式绑定 第一个也是最常见的规则称为 隐式绑定. var a = { str: 'hello', ...
- javascript实现blob加密视频源地址
一.HTML代码: <video id="my-video" class="video-js" playsinline controls preload= ...
- Python学习日记(四十) Mysql数据库篇 八
Mysql存储过程 存储过程是保存在Mysql上的一个别名(就是一堆SQL语句),使用别名就可以查到结果不用再去写SQL语句.存储过程用于替代程序员写SQL语句. 创建存储过程 delimiter / ...
- MS Sql 优化步骤及优化not in一例
今天接到客户投诉说系统卡死了,经过一翻努力,终于解决了.现将解决步骤记录一下,以便下次参考: 因为客户系统集中在阿里云上面,使用的是ms sql2008数据库,上面有N个客户,一下子无法知道是哪个客户 ...
- 如何开启telnet服务LINUX&Windows
一.LINUX centos 1.Linux安装telnet包 # yum install telnet* # rpm -qa |grep telnet telnet-server-0.17-47.e ...
- Centos6.5 下安装 tmux(免编译)
环境:Centos6.5是新安装的,没有安装过其它的软件包.思路是安装epel的源后再安装tmux. yum install epel-release # 安装Linux的 epel 的yum源 yu ...
- django 基础进阶ORM 2
1.多表操作 添加记录: 针对一对多 book_obj=Book.objects.create(title="python葵花宝典",price=100,publishDate=& ...
- LengthFieldBasedFrameDecoder
LengthFieldBasedFrameDecoder 详解 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -31[ 博客园 总入口 ] 文章目录 LengthFieldBasedFr ...
- 第08节-开源蓝牙协议栈BTStack数据处理
本篇博客根据韦东山的视频整理所得. 在上篇博客,通过阅读BTStack的源码,大体了解了其框架,对于任何一个BTStack的应用程序都有一个main函数,这个main函数是统一的.这个main函数做了 ...