欧博开户:Java8——方式引用

admin 2个月前 (07-14) 科技 26 0

方式引用就是通过类名或方式名引用已经存在的方式来简化lambda表达式。那么什么时候需要用方式引用呢?若是lamdba体中的内容已经有方式实现了,我们就可以使用方式引用。

一、方式引用的三种语法花样

1. 工具::实例方式名

lamdba写法:

@Test
void test1(){
    Consumer<String> con = x -> System.out.println(x);
}

方式引用写法:

@Test
void test2(){
    PrintStream out = System.out;
    Consumer<String> con = out::println;
}

consumer接口:

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

注重:被挪用的方式的参数列表和返回值类型需要与函数式接口中抽象方式的参数列表和返回值类型要一致。

2. 类::静态方式名

lamdba写法:

@Test
void test3(){
    Comparator<Integer> com = (x, y) -> Integer.compare(x,y);
}

方式引用写法:

@Test
void test4(){
    Comparator<Integer> com = Integer::compare;
}

Comparator接口:

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
}

Integer类部分内容:

public final class Integer extends Number implements Comparable<Integer> { 
	public static int compare(int x, int y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }
}

注重:被挪用的方式的参数列表和返回值类型需要与函数式接口中抽象方式的参数列表和返回值类型要一致。

3. 类::实例方式名

lamdba写法:

@Test
void test5(){

    BiPredicate<String,String> bp = (x,y) -> x.equals(y);
}

方式引用写法:

@Test
void test6(){
    BiPredicate<String,String> bp = String::equals;
}

BiPredicate接口:

@FunctionalInterface
public interface BiPredicate<T, U> {
    boolean test(T t, U u);
}

注重:第一个参数是这个实例方式的挪用者,第二个参数是这个实例方式的参数时,就可以使用这种语法。

二、组织器引用

类::new

lamdba写法:

@Test
void test7(){
    Supplier<Person> supplier = ()->new Person();
}

组织器引用写法:

@Test
void test8(){
    Supplier<Person> supplier = Person::new;
}

Supplier接口:

@FunctionalInterface
public interface Supplier<T> {
    T get();
}

Person类:

@Data
public class Person implements Serializable {
    private static final long serialVersionUID = -7008474395345458049L;

    private String name;
    private int age;

    public Person() {
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

注重:person类中有两个组织器,要挪用哪个组织器是函数式接口决议的,也就是Supplier接口中的get()方式是无参的,那么就挪用的是person中的无参组织器。

三、数组引用

Type::new

lamdba写法:

@Test
void test9(){
    Function<Integer,String[]> fun = x -> new String[x];
}

数组引用写法:

@Test
void test10(){
    Function<Integer, String[]> fun = String[]::new;
}

Function接口部分内容:

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
}

总结

  • 方式应用及组织器引用实在可以理解为lamdba的另一种表现形式
  • 方式引用被挪用的方式的参数列表和返回值类型需要与函数式接口中抽象方式的参数列表和返回值类型要一致
  • 方式引用中使用类::实例方式的条件是第一个参数是这个实例方式的挪用者,第二个参数是这个实例方式的参数
  • 组织器引用需要挪用的组织器的参数列表要与函数式接口中抽象方式的参数列表一致
,

联博开奖网

www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

Allbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:欧博开户:Java8——方式引用

网友评论

  • (*)

最新评论

站点信息

  • 文章总数:521
  • 页面总数:0
  • 分类总数:8
  • 标签总数:945
  • 评论总数:144
  • 浏览总数:3159