java8 方法引用

阅读数:173 评论数:0

跳转到新版页面

分类

python/Java

正文

作用:使代码更简洁。

有些情况下,我们用lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作,而通过方法引用可以使代码更简洁、更容易理解。

类型 语法 对应的Lambda表达式
静态方法引用 类名::staticMethod (args) -> 类名.staticMethod(args)
实例方法引用 inst::instMethod (args) -> inst.instMethod(args)
对象方法引用 类名::instMethod (inst,args) -> 类名.instMethod(args)
构建方法引用 类名::new (args) -> new 类名(args)

先来看一段代码:

    public static void main(String[] args) {
        List<String> strList = Arrays.asList(new String[] { "a", "c", "b" });

        strList.stream().sorted((s1, s2) -> s1.compareToIgnoreCase(s2)).forEach(s -> System.out.println(s));
    }
上述程序生成一个Stream流,对流中的字符串进行排序并遍历打印。程序中采用lambda表达式的方式代替匿名类简化了代码,然而代码中两处lambda表达式都仅仅调用的是一个已存在的方法:String.compareToIgnoreCase、System.out.println,这种情况可以用方法引用来简化:

    public static void main(String[] args) {

        List<String> strList = Arrays.asList(new String[] { "a", "c", "b" });

        strList.stream().sorted(String::compareToIgnoreCase).forEach(System.out::println);
    }
​

 

对比一下可以看到,上述程序分别采用了类的任意对象的实例方法引用特定对象的实例方法引用两种方法引用形式,采用方法引用的方式可以简化lambda表达式的写法。
 

java8方法引用有四种形式:

1、静态方法引用

ClassName::staticMethodName

public class Test
{
    public static void main(String[] args)
    {
        //lambda表达式使用:
        Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(s -> Test.println(s));
        //静态方法引用:
        Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(Test::println);
    }
    
    public static void println(String s)
    {
        System.out.println(s);
    }
}

2、构造器引用

ClassName::new

Supplier<List<String>> supplier1= () -> new  ArrayList<String>();

等价于

Supplier<List<String>> supplier = ArrayList<String>::new;

3、类的非静态方法引用

ClassName::MethodName

4、对象实例的方法引用

instance::methodName

lambda表达式可用方法引用代替的场景可以简要概括为:lambda表达式的主体仅包含一个表达式,且该表达式仅调用了一个已经存在的方法。方法引用的通用特性方法引用所使用方法的入参和返回值与lambda表达式实现的函数式接口的入参和返回值一致





相关推荐

修饰接口中默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制)。 public int

一、概述 1、lambda允许把函数作为一个方法的参数。 二、取代某些匿名内部类 1、无参数函数的简写 如果需要创建一个线程,一种常见的写法是这样: // JDK7 匿名内部类写法 new Threa

一、概述 如果没有终端操作,中间操作是不会得到执行的(惰性求值)。 stream的使用可以将代码中大量的for循环变为简单的链式函数操作,但是需要注意性能,在数据量小的情况下二都相差不多,但是在数据

在JAVA5已经提供了Future和Callable的实现,可以用于阻塞式获取结果,如果想要异步获取结果,通常都会以轮询的方式去获取结果,如下: <pre class="language

Supplier接口是JAVA8以后配合lambda表达式和函数式接口编程(FunctionInterface,以下简称FI)组合使用的一个接口。它最适合于表示工厂,简而言之,Supplier&

一、函数式编程和非函数编程的区别 (1)函数式编程:先考虑传入的参数,再考虑方法的实现。 (2)非函数编程:先定义好方法,再传入指定的参数 二、何为函数式接口 函数式接口(Functional Int

java8时,java.util.concurrent.atomic包中提供了一个新的原子类LongAddr,提供了原子累计值的方法,在高并发的场景下它比Ato

一、Java8简介 1、添加了函数式编程、Stream、全新的日期处理类。 2、函数编程新加了一些概念:lambda表达式、函数式接口、函数引用、默认方法、Optional类(干掉空指针)等。 3、S

一、概述 Java8引入了@Contented这个新的注解来减少伪共享(False Sharing)的发生。 二、伪共享 1、缓存行 CPU读取内存数据时并非一次只读一个字节,而是会读一段64字节长度

一、概述 Collectors是java.util.stream包下的一个工具类,其中各个方法的返回值可以作为java.util.stream.Stream#collect的入参,实现对队列的各种操作