1、Predicate/Consumer/Function/Supplier介绍

Predicate boolean test(T t);
Consumer accpet(T t);
Function<T, R> R apply(T t);
Supplier<T> T get();

以Predicate为例,引申出很多类似的Predicate,如IntPredicate、DoublePredicate、BiPredicate、LongPredicate。但是他们的用法都是差不多的。比较类似。

2、举例子:

package com.cy.java8;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.*; public class LambdaUsage { private static List<Apple> filter(List<Apple> source, Predicate<Apple> predicate){
List<Apple> result = new ArrayList<>();
for(Apple a : source){
if(predicate.test(a)){
result.add(a);
}
}
return result;
} //根据一个long类型的参数过滤
private static List<Apple> filterByWeight(List<Apple> source, LongPredicate predicate){
List<Apple> result = new ArrayList<>();
for(Apple a : source){
if(predicate.test(a.getWeight())){
result.add(a);
}
}
return result;
} //根据两个参数过滤
private static List<Apple> filterByColorWeight(List<Apple> source, BiPredicate<String, Long> bipredicate){
List<Apple> result = new ArrayList<>();
for(Apple a : source){
if(bipredicate.test(a.getColor(), a.getWeight())){
result.add(a);
}
}
return result;
} private static void simpleTestConsumer(List<Apple> source, Consumer<Apple> consumer){
for(Apple a : source){
consumer.accept(a);
}
} private static String testFunction(Apple apple, Function<Apple, String> fun){
return fun.apply(apple);
} public static void main(String[] args) {
List<Apple> list = Arrays.asList(new Apple("green", 120), new Apple("red", 150));
List<Apple> greenList = filter(list, apple -> apple.getColor().equals("green"));
System.out.println(greenList); System.out.println("-----------------------------");
List<Apple> weightList = filterByWeight(list, weight -> weight>=150);
System.out.println(weightList); System.out.println("-----------------------------");
List<Apple> result = filterByColorWeight(list, (color, weight) -> color.equals("red") && weight > 100);
System.out.println(result); System.out.println("-----------------------------");
simpleTestConsumer(list, apple -> System.out.println("print apple's string method: " +apple)); System.out.println("-----------------------------");
String color = testFunction(new Apple("yellow", 10), apple -> apple.getColor());
System.out.println(color); System.out.println("-----------------------------");
Supplier<String> supplier = String::new;
System.out.println(supplier.get().getClass());
} }

打印结果:

[Apple(color=green, weight=120)]
-----------------------------
[Apple(color=red, weight=150)]
-----------------------------
[Apple(color=red, weight=150)]
-----------------------------
print apple's string method: Apple(color=green, weight=120)
print apple's string method: Apple(color=red, weight=150)
-----------------------------
yellow
-----------------------------
class java.lang.String

3、方法推导解析      

什么情况下允许方法推导的方式来写呢?
1.可以通过一个类的静态方法,比如Integer::parseInt
2.可以通过一个类的成员方法。
3.可以通过一个类的实例的方法。
4.可以通过构造函数的推导。

举例子:

package com.cy.java8;

import lombok.Data;

@Data
public class ComplexApple {
private String color;
private long weight;
private String name; public ComplexApple(String color, long weight, String name) {
this.color = color;
this.weight = weight;
this.name = name;
}
}
package com.cy.java8;

@FunctionalInterface
public interface ThreeParamFuntion<T, U, K, R> { R apply(T t, U u, K k);
}
package com.cy.java8;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Stream; public class MethodReference { public static void main(String[] args) {
/*Consumer<String> consumer = s -> System.out.println(s);
useConsumer(consumer,"hello alex");*/ useConsumer(s -> System.out.println(s),"hello alex");
useConsumer(System.out::println, "hello today"); List<Apple> list = Arrays.asList(new Apple("green", 120), new Apple("abc", 100), new Apple("red", 150));
System.out.println(list);
list.sort((a1, a2) -> a1.getColor().compareTo(a2.getColor()));
System.out.println(list); //比如循环输出apple信息
list.stream().forEach(apple -> System.out.println(apple)); //可以改成成如下
System.out.println("-----------------------------------------");
list.stream().forEach(System.out::println);
System.out.println("-----------------------------------------"); //方法推导,通过一个类的静态方法
Function<String, Integer> funtion = Integer::parseInt;
int result = funtion.apply("123");
System.out.println(result); //方法推导,通过一个类的成员方法
BiFunction<String, Integer, Character> f1 = String::charAt;
System.out.println(f1.apply("index", 0)); //方法推导,通过一个类的实例的方法
String s = new String("index");
Function<Integer, Character> f2 = s::charAt;
System.out.println(f2.apply(1)); //通过构造函数的推导
Supplier<String> s1 = String::new;
System.out.println(s1.get().getClass().getSimpleName()); BiFunction<String, Long, Apple> biFunction = Apple::new;
System.out.println(biFunction.apply("pink", 2L)); //三个参数的构造方法,ComplexApple::new,需要自己定义FunctionalInterface
ThreeParamFuntion<String, Long, String, ComplexApple> threeParamFuntion = ComplexApple::new;
System.out.println(threeParamFuntion.apply("black", 1L, "blackApple")); //再次看下上面list的排序的另一种方法
List<Apple> list2 = Arrays.asList(new Apple("green", 120), new Apple("abc", 100), new Apple("red", 150));
list2.sort(Comparator.comparing(Apple::getColor));
System.out.println(list2);
} private static <T> void useConsumer(Consumer<T> consumer, T t){
consumer.accept(t);
consumer.accept(t);
} }

打印如下:

hello alex
hello alex
hello today
hello today
[Apple(color=green, weight=120), Apple(color=abc, weight=100), Apple(color=red, weight=150)]
[Apple(color=abc, weight=100), Apple(color=green, weight=120), Apple(color=red, weight=150)]
Apple(color=abc, weight=100)
Apple(color=green, weight=120)
Apple(color=red, weight=150)
-----------------------------------------
Apple(color=abc, weight=100)
Apple(color=green, weight=120)
Apple(color=red, weight=150)
-----------------------------------------
123
i
n
String
Apple(color=pink, weight=2)
ComplexApple(color=black, weight=1, name=blackApple)
[Apple(color=abc, weight=100), Apple(color=green, weight=120), Apple(color=red, weight=150)]

lambda表达式使用解析的更多相关文章

  1. Lambda表达式树解析(下)

    概述 前面章节,总结了Lambda树的构建,那么怎么解析Lambda表达式树那?Lambda表达式是一种委托构造而成,如果能够清晰的解析Lambda表达式树,那么就能够理解Lambda表达式要传递的正 ...

  2. Lambda表达式树解析(下)包含自定义的provider和查询

    概述 前面章节,总结了Lambda树的构建,那么怎么解析Lambda表达式树那?Lambda表达式是一种委托构造而成,如果能够清晰的解析Lambda表达式树,那么就能够理解Lambda表达式要传递的正 ...

  3. 今夜我懂了Lambda表达式_解析

    现在时间午夜十一点~ 此刻的我血脉喷张,异常兴奋:因为专注得学习了一把java,在深入集合的过程中发现好多套路配合Lambda表达式真的是搜椅子,so开了个分支,决定从"只认得", ...

  4. Python 中Lambda 表达式 实例解析

    Lambda 表达式 lambda表达式是一种简洁格式的函数.该表达式不是正常的函数结构,而是属于表达式的类型.而且它可以调用其它函数. 1.基本格式: lambda 参数,参数...:函数功能代码 ...

  5. C++11 Lambda表达式简单解析

    C++11 新增了非常多特性,lambda 表达式是当中之中的一个.假设你想了解的 C++11 完整特性, 建议去http://www.open-std.org/看看新标准! 非常多语言都提供了 la ...

  6. SqlHelper简单实现(通过Expression和反射)5.Lambda表达式解析类

    这个ExpressionHelper类,是整个SqlHelper中,最核心的一个类,主要功能就是将Lambda表达式转换为Sql语句.同时这个转换过程比较复杂,所以下面详细讲解一下思路和这个类的作用. ...

  7. python函数,lambda表达式,三目运算,列表解析,递归

    一.自定义函数 定义函数时,函数体不执行:只有在调用函数时,函数体才执行.函数的结构: 1. def 2. 函数名 3. 函数体 def func_name(): 函数体 4. 返回值 如果没有声明返 ...

  8. 解析 Lambda 表达式

    我们先创建一个表达式树: Expression<Func<int, int, int>> expression = (a,b) => a + b; 我们的例子是一个Exp ...

  9. 将Lambda表达式作为参数传递并解析-在构造函数参数列表中使用Lambda表达式

    public class DemoClass { /// <summary> /// 通过Lambda表达式,在构造函数中赋初始值 /// </summary> /// < ...

随机推荐

  1. 利用ARouter实现组件间通信,解决子模块调用主模块问题

    如果你还没使用过ARouter请你按照这篇下面博客尝试使用下然后再往下看组件通信的内容(不然的话可能会懵逼)Android Studio接入ARouter以及简单使用 如果你使用过ARouter请继续 ...

  2. The authenticity of host 'github.com (52.74.223.119)' can't be established.

    出现这种错误的问题应考虑是否配置ssh,若没有配置,则进行相关配置 若配置后还出现这种问题,这是由于本地缺少一个文化夹.直接yes而不是y或是回车

  3. 2019-11-29-dotnet-core-使用-CoreRT-将程序编译为-Native-程序

    title author date CreateTime categories dotnet core 使用 CoreRT 将程序编译为 Native 程序 lindexi 2019-11-29 08 ...

  4. linux上安装Eclipse

    之所以要在linux上安装Eclipse,是因为一开始我是通过Eclipse+MingW+Samba+GDBserver方式在Windows上远程操作,准备编译调试nginx源代码的,可是在编译调试过 ...

  5. 自动化监控软件之zabbix安装

    自动化监控系统 cacti : 基于snmp(简单的网络管理协议)协议的监控软件,强大的绘图软件 缺点: 自带的监控模板比较少,不能默认 自带监控报警功能(只能自己去官网下载模板) Nagios: 插 ...

  6. PAT Basic 1091 N-自守数 (15 分)

    如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”.例如 3,而 2 的末尾两位正好是 9,所以 9 是一个 3-自守数. 本题就请你编写程序判断一个给定的 ...

  7. springboot-不同名称项目的 redis session共享

    引入JAR <dependency> <groupId>org.springframework.session</groupId> <artifactId&g ...

  8. ip addr详解

    Windows上查看IP地址是ipconfig, Linux上是ifconfig,但是Linux上还有一个命令叫ip addr可以查看IP地址. ip addr : lo: <LOOPBACK, ...

  9. 树莓派Zero W无键盘无屏幕初始化

    买了个树莓派Zero W,结果发现没mini hdmi线 淘宝了一根mini hdmi,等了5天,拿到手后发现zero还没地接键盘,这下脑袋大了 查了下资料,发现树莓的系统,可以这boot分区中加入一 ...

  10. python 字符词串和字符串的转换

    type(' i am ') str type(''.join('i am')) str ''.join('sda sadaa') 'sda sadaa' q=str('i am the teache ...