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的…
老方法这么写:

        List list = Arrays.asList("a11", "b232", "C111", "A1", "B");

        for (String s : list) {
            if(s.length() > 2){
                System.out.println(s.length());
            }
        }

Lambda表达式这么写:

List list = 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接口:对输入的参数进行操作。有输入没输出.

  Consumer  consumer3 =  s -> {
            String s1 = s.toUpperCase();
            System.out.println(s1);
        };

只有调用了,控制台才有输出

consumer.accept("ss");

其实,主要是理解Consumer,消费者,就可以了~主要是对入参做一些列的操作,在stream里,主要是用于forEach;内部迭代的时候,对传入的参数,做一系列的业务操作,没有返回值;

Supplier (提供者)

看语义,可以看到,这个接口是一个提供者的意思,只有一个get的抽象类,没有默认的方法以及静态的方法,传入一个泛型T的,get方法,返回一个泛型T.

Supplier supplier = 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对象.
看看实例.

 Function function = (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