java8之lambda表达式

Posted weiqihome

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java8之lambda表达式相关的知识,希望对你有一定的参考价值。

lambda表达式是java8提供了一个比较重要的新特性之一,简化了很多代码的编写。

1、先看一个简单的例子,不是用lambda表达式创建一个线程:

        Thread thread = new Thread(new Runnable() 
            @Override
            public void run() 
                System.out.println("hello world");
            
        );

在Thread构造函数内传入一个Runnable接口的实现类。

2、再看一下使用lambda表达式创建线程的例子:

        Thread thread1 = new Thread(()->
            System.out.println("hello world");
        );

使用lambda表达式以后回省略很多代码,不用再去重复的写要实现的方法名称,当然并不是所有的接口都能使用lambda表达式,必须要是函数式接口才能使用lambda。

函数式接口

有且只有一个抽象方法的接口被称为函数式接口。

函数式接口可以显示的被@FunctionalInterface所修饰,当被标识的接口不满足规定时,编译器会报错。

例:

@FunctionalInterface
public interface Runnable 
    public abstract void run();

lambda表达式的转换方式

//下面是三个自定义的函数式接口
interface T1
    void say(int a);

interface T2
    String say(int a);

interface T3
    int say(int a,int b,int c);


    //()里面的数据表示参数,后面跟一个箭头->,最后面是大括号
    Runnable runnable = ()->
        System.out.println("hello world");
    ;
    //当参数只有一个时,可以省去()
    T1 t1 = a->
        System.out.println("hi");
    ;
    //当方法体只有一行时,可以省去
    T1 t2 = a-> System.out.println("hi");
    //有返回值的方法
    T2 t21 = (a)->
        return a+"hi";
    ;
    //同样的,方法体只有一行时,可以省略,并且省略return
    T2 t22 = a -> a+ "hi";
    //有多个参数的方法,只需要在()内写上参数就行,并不需要写参数类型,因为lambda会自己推断参数类型,
    T3 t3 = (a,b,c)-> a + b + c;

使用lambda在实际项目开发者确实能省略很多的代码,比如在使用线程池处理线程,使用Comparable进行比较等等。

Java8内置的函数式接口

Java8提供了一个java.util.function包,包含了很多函数式接口,下面是最为基本也是最常用的4个,这四个函数式接口在我上一篇说stream的时候基本上都提到过,所以下面只是列出以下代码并做一个简单的说明,就不再去写例子了,有兴趣的可以自己去写一些实现类去了解一下,都是非常简单的接口,这些接口在stream里面用到的非常多。

Function接口:

@FunctionalInterface
public interface Function<T, R> 

    R apply(T t);

    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) 
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    

    default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) 
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    

    static <T> Function<T, T> identity() 
        return t -> t;
    

Function接口的唯一抽象方法是apply,作用是接收一个指定类型的参数,返回一个指定类型的结果

Consumer接口

@FunctionalInterface
public interface Consumer<T> 
    void accept(T t);

    default Consumer<T> andThen(Consumer<? super T> after) 
        Objects.requireNonNull(after);
        return (T t) ->  accept(t); after.accept(t); ;
    

Consumer接口中accept方法的作用是接收指定参数类型,无返回值,重点在于内部消费

Predicate接口

@FunctionalInterface
public interface Predicate<T> 

    boolean test(T t);

    default Predicate<T> and(Predicate<? super T> other) 
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    

    default Predicate<T> negate() 
        return (t) -> !test(t);
    

    default Predicate<T> or(Predicate<? super T> other) 
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    

    static <T> Predicate<T> isEqual(Object targetRef) 
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    

Predicate中的test方法,传入指定类型参数,返回布尔类型的结果,用于判断,断言

Supplier接口:

@FunctionalInterface
public interface Supplier<T> 

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();

Supplier意为供应,只有一个方法get,不接收任何参数,只返回指定类型结果。

 

以上是关于java8之lambda表达式的主要内容,如果未能解决你的问题,请参考以下文章

JAVA8之lambda表达式详解,及stream中的lambda使用

java8之lambda表达式

java8之lambda表达式看这一篇就够了

java8之lambda表达式

java8新特性之Lambda表达式入门

Java8新特性之lambda表达式