【java8新特性 简述】方法引用“::”表达式

2018-10-22  本文已影响0人  浪漫宇宙与人间日常

java8的方法引用是一种编码格式,通常结合lambda表达式一起使用,结合一起使用会进一步减少代码量,使得代码更加简洁

简单实例

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));
    }

相信上面的编码风格大家都已经能够比较熟练地知道其中的意思了。

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);
    }

可以比较看出来,两种编码的风格上会有更多不同,然后后者可能编写代码更少,看起来更加清爽,前提是你了解java8的一些新特性

接着,我们就一起来学习java8关于方法引用的一些语法吧!(内容非常简洁)

方法引用

java8方法引用有四种形式:

静态方法引用       :   ClassName :: staticMethodName
构造器引用        :   ClassName :: new
类的任意对象的实例方法引用:   ClassName :: instanceMethodName
特定对象的实例方法引用  :   object :: instanceMethodName

就是上面的四种方式,下面将给出四种使用的简单实例

//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);

适用于lambda表达式主体中仅仅调用了某个类的静态方法的情形

Supplier<List<String>> supplier1= () -> new  ArrayList<String>();
//等价于
Supplier<List<String>> supplier = ArrayList<String>::new;

适用于lambda表达式主体中仅仅调用了某个类的构造函数返回实例的场景。

  Arrays.sort(strs,(s1,s2)->s1.compareToIgnoreCase(s2));
// 等价于
  Arrays.sort(strs, String::compareToIgnoreCase);
  1. 方法引用的通用特性:方法引用所使用方法的入参和返回值与lambda表达式实现的函数式接口的入参和返回值一致;
  2. lambda表达式的第一个入参为实例方法的调用者,后面的入参与实例方法的入参一致。
// 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);

适用于lambda表达式的主体中仅仅调用了某个对象的某个实例方法的场景。

这种代码的编写方式并不被所有的人喜欢,每个人的看法不一样,有的人并不能很好的理解这种写法,所以大家自己根据自己的情况酌情使用。

上一篇 下一篇

猜你喜欢

热点阅读