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表达式和方法引用的更多相关文章

  1. JAVA8之Lambda表达式与方法引用表达式

    一.Lambda表达式 基本语法: lambdaParameters->lambdaBody lambdaParameters传递参数,lambdaBody用于编写逻辑,lambda表达式会生成 ...

  2. java8的新特性之lambda表达式和方法引用

    1.1. Lambda表达式 通过具体的实例去体会lambda表达式对于我们代码的简化,其实我们不去深究他的底层原理和背景,仅仅从用法上去理解,关注两方面: lambda表达式是Java8的一个语法糖 ...

  3. Java函数式编程:一、函数式接口,lambda表达式和方法引用

    Java函数式编程 什么是函数式编程 通过整合现有代码来产生新的功能,而不是从零开始编写所有内容,由此我们会得到更加可靠的代码,并获得更高的效率 我们可以这样理解:面向对象编程抽象数据,函数式编程抽象 ...

  4. java8 探讨与分析匿名内部类、lambda表达式、方法引用的底层实现

    问题解决思路:查看编译生成的字节码文件 目录 测试匿名内部类的实现 小结 测试lambda表达式 小结 测试方法引用 小结 三种实现方式的总结 对于lambda表达式,为什么java8要这样做? 理论 ...

  5. Java 8 Lambda表达式之方法引用 ::双冒号操作符

    双冒号运算符就是java中的方法引用,方法引用的格式是类名::方法名. 这里只是方法名,方法名的后面没有括号“()”.--------> 这样的式子并不代表一定会调用这个方法.这种式子一般是用作 ...

  6. Java提升二:Lambda表达式与方法引用

    1.Lambda表达式 1.1.定义 lambda表达式是对于函数式接口(只含有一个抽象方法的接口)的简洁实现方式.它与匿名内部类的作用相似,但是就使用范围而言,匿名内部类更为广泛,而lambda表达 ...

  7. 一文带你深入了解 Lambda 表达式和方法引用

    前言 尽管目前很多公司已经使用 Java8 作为项目开发语言,但是仍然有一部分开发者只是将其设置到 pom 文件中,并未真正开始使用.而项目中如果有8新特性的写法,例如λ表达式.也只是 Idea Al ...

  8. lambda表达式之方法引用

    /** * 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器.<br> * 与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码. ...

  9. Java 8-Lambda表达式、方法引用、标准函数接口与流操作、管道操作之间的关系

    1.Lambda表达式与接口之间的关系 只要Lambda表达式的声明形式与接口相一致,在很多情况下都可以替换接口.见如下代码 Thread t1 = new Thread(new Runnable() ...

随机推荐

  1. 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法

    网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) ​ 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...

  2. 大数据除了Hadoop还有哪些常用的工具?

    大数据除了Hadoop还有哪些常用的工具? 1.Hadoop大数据生态平台Hadoop 是一个能够对大量数据进行分布式处理的软件框架.但是 Hadoop 是以一种可靠.高效.可伸缩的方式进行处理的.H ...

  3. 彻底搞懂JVM类加载器:基本概念

    本文阅读时间大约9分钟. 写在前面 在Java面试中,在考察完项目经验.基础技术后,我会根据候选人的特点进行知识深度的考察,如果候选人简历上有写JVM(Java虚拟机)相关的东西,那么我常常会问一些J ...

  4. Linux从入门到放弃、零基础入门Linux(第三篇):在虚拟机vmware中安装linux(二)超详细手把手教你安装centos6分步图解

    一.继续在vmware中安装centos6.9 本次安装是进行最小化安装,即没有图形化界面的安装,如果是新手,建议安装带图形化界面的centos, 具体参考Linux从入门到放弃.零基础入门Linux ...

  5. mysql--日志文件

    1 选择常规查询日志和慢查询日志输出目标 1.1  log_output查看.定义 所谓的输出目标就是日志写入到哪里,mysql中用系统变量 log_output来指定输出目标,log_output的 ...

  6. h5表单亲测

    Document 下载进度: 标签. 牛奶 面包 男 女 one two three 按钮 搜索 请输入搜索内容 加密强度 用户名 Email 密码 年龄 身高 生日 这一系列是很酷的一个类型,完全解 ...

  7. Fork/Join框架与Java8 Stream API 之并行流的速度比较

    Fork/Join 框架有特定的ExecutorService和线程池构成.ExecutorService可以运行任务,并且这个任务会被分解成较小的任务,它们从线程池中被fork(被不同的线程执行)出 ...

  8. linuxIP地址配置字段说明

    虚拟机网络适配器改成桥接 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 设备名称 BOOTPROTO=dhcp /static 自动 ...

  9. JDK8 Steam流操作

    原文:https://github.com/niumoo/jdk-feature/blob/master/src/main/java/net/codingme/feature/jdk8/Jdk8Str ...

  10. 重复的DNA序列[哈希表] LeetCode.187

    所有 DNA 由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:"ACGAATTCCG".在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助. 编写一个函数 ...