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() ...
随机推荐
- 对比ubuntu与centos系统
CentOS与Ubuntu该如何选择,哪个更好用.笔者在自媒体平台收集了一些网友的观点,较为经典,分享给大家.至于应该选择哪个,希望看完本文章后,读者心中有数. 观点1:CentOS适用于服务器,Ub ...
- 通过Nginx获取用户真实IP
nginx配置 location / { proxy_set_header Host $host; proxy_set_header X-real-ip $remote_addr; proxy_set ...
- CSS泣鬼神
博主网站 一.CSS介绍和语法 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 每个CSS样式由两个组成部分:选择器和声明.声明又包括属性和属性值.每个声明 ...
- preflight request预检请求
preflight request预检请求,负责检查是否允许跨域请求,但是注意并不是所有的跨域请求都会发送preflight请求.对与那些幂等的请求,如GET请求,就不会发送preflight请求.只 ...
- SPring boot jpa 封装查询条件
最近使用spring data jpa做了两个项目,对于动态查询的不友好做了个类似hibernate的封装,记录也分享下 首先定义一个所有条件的容器,继承Specification /** * 定义一 ...
- mongo连接不上Timed out after 30000
本地连接mongo报错,错误代码为: Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while wait ...
- Odoo中的字段显示方式和行为控制
在odoo的视图中,字段都是通过widget来控制显示效果和行为的. 一般情况下,不同类型的字段odoo会使用默认的widget来显示和控制它的行为. options以一种JSON对象的形 ...
- Linux操作系统安全-使用gpg实现对称加密
Linux操作系统安全-使用gpg实现对称加密 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.gpg工具包概述 1>.什么是gpg GnuPG是GNU负责安全通信和数据存 ...
- Mybatis-plus中不列出全部字段
//不列出全部字段 @Test public void test10() { QueryWrapper<User> wrapper = new QueryWrapper<>() ...
- Python实战之ATM+购物车
ATM + 购物车 需求分析 ''' - 额度 15000或自定义 - 实现购物商城,买东西加入 购物车,调用信用卡接口结账 - 可以提现,手续费5% - 支持多账户登录 - 支持账户间转账 - 记录 ...