java8新特性专题之三、lambda四大内置函数式接口
lambda表达式
- 什么是Lambda表达式
- 函数式接口
-
-
- 1使用案例
- 2**来一个带参数的用法**
- 3来一个带参数和返回值的
-
- 方法引用
- 如何构建方法引用
-
- 跳过理论看案例
- 函数式接口
-
- 内置4大接口
-
- Predicate:断言型接口
- Consumer 接口(消费者)
- Supplier (提供者)
- Function接口以及同类型的特化的接口
表达式
可以把Lambda表达式理解为可传递的匿名函数的一种方式
它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。这个定义够大的,让我们慢慢道来。
学习lambda表达式就要先知道函数式接口是什么?
Predicate:断言型接口
java.util.function.Predicate接口定义了一个名叫test的抽象方法,它接受泛型T对象,并返回一个boolean。这恰恰和你先前创建的一样,现在就可以直接使用了。在你需要表示一个涉及类型T的布尔表达式时,就可以使用这个接口。比如,你可以定义一个接受String对象的Lambda表达式,
如下所示。
案例:
比如要从个集合中.打印所有字符串的长度大于2的…
老方法这么写:
Listlist = Arrays.asList("a11", "b232", "C111", "A1", "B"); for (String s : list) { if(s.length() > 2){ System.out.println(s.length()); } }
Lambda表达式这么写:
Listlist = Arrays.asList("a11", "b232", "C111", "A1", "B"); list.stream().filter((s)->s.length()>2).forEach(System.out::println);
stream 这个流先不用管. 下一遍文章分析.
主要看这段 (s)->s.length()>2 .
这就是用Predicate接口来实现的.
Consumer 接口(消费者)
consumer接口:对输入的参数进行操作。有输入没输出.
Consumerconsumer3 = s -> { String s1 = s.toUpperCase(); System.out.println(s1); };
只有调用了,控制台才有输出
consumer.accept("ss");
其实,主要是理解Consumer,消费者,就可以了~主要是对入参做一些列的操作,在stream里,主要是用于forEach;内部迭代的时候,对传入的参数,做一系列的业务操作,没有返回值;
Supplier (提供者)
看语义,可以看到,这个接口是一个提供者的意思,只有一个get的抽象类,没有默认的方法以及静态的方法,传入一个泛型T的,get方法,返回一个泛型T.
Suppliersupplier = Food::new; Food food = supplier.get(); food.setRet(1); int ret = food.getRet();
可以看到,这个接口,只是为我们提供了一个创建好的对象,这也符号接口的语义的定义,提供者,提供一个对象,
直接理解成一个创建对象的工厂,就可以了.
Function接口以及同类型的特化的接口
先看看Function的定义
@FunctionalInterface public interface Function{ R apply(T t); default Function compose(Function<? super V, ? extends T> before) { Objects.requireNonNull(before); return (V v) -> apply(before.apply(v)); } default Function andThen(Function<? super R, ? extends V> after) { Objects.requireNonNull(after); return (T t) -> after.apply(apply(t)); } static Function identity() { return t -> t; }
看看Function的作用
Funtion接口,定义了一个apply的抽象方法,接收一个泛型T对象,并且返回泛型R对象.
看看实例.
Functionfunction = (i) ->{ if(i == 1){ return "1月"; }else if(i == 2){ return "2月"; } return "没有"; }; System.out.println(function.apply(1));
下面我们看下Funtion这个接口的“扩展”的原始类型特化的一些函数接口
IntFunction,IntToDoubleFunction,IntToLongFunction,LongFunction,LongToDoubleFunction,LongToIntFunction,DoubleFunction,ToIntFunction,ToDoubleFunction,ToLongFunction
我们知道,我们在做基础数据处理的时候(eg: Integer i=0; Integer dd= i+1;),会对基础类型的包装类,进行拆箱的操作,转成基本类型,再做运算处理,拆箱和装箱,其实是非常消耗性能的,尤其是在大量数据运算的时候;这些特殊的Function函数式接口,根据不同的类型,避免了拆箱和装箱的操作,从而提高程序的运行效率.
看到这里可能还是看的不明白,也不知道他们的具体用处.
来源:https://blog.csdn.net/shuai_ge_feng/article/details/115127607?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-3.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-3.pc_relevant_default&utm_relevant_index=6