Natukasi
@Natukasi

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Collectors.toMapの第1引数のFunctionにSupplierを指定してもエラーにならないのはなぜか

Q&A

Closed

解決したいこと

Java Goldの参考書を真似てコーディングしています。
以下のCollectors.toMapの第1引数にFunctionではなくSupplierを指定しています。エラーにならない。なぜか教えてほしいです。
実際のソースは下記を参照願います。

public static <T,K,U> Collector<T,?,Map<K,U>> toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)

該当するソースコード

class Value {
    int price;
    String name;

    public Value(int price, String name) {
        this.price = price;
        this.name = name;
    }

    public int getPrice() {    
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getName() {         //引数なしリターンありのためSupplierの認識
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public String toString() {
        return "price:" + price + " name:" + name;
    }
}
public class Outer {
    public static void main(String[] args) {
        List<Value> l = Arrays.asList(
                new Value(1,"andy"),
                new Value(2,"john"),
                new Value(3,"laula"),
                new Value(4,"miki"),
                new Value(5,"sally"));
        Stream<Value> st = l.stream();
        Map<String, Value> mp = st.collect(Collectors.toMap(
                Value::getName,     //本来FunctionのところSupplierを指定
                b -> b));
        mp.keySet().stream().forEach(System.out::println);
        mp.keySet().stream().forEach(a -> System.out.println(mp.get(a)));
    }
}
0

1Answer

Java には詳しくありませんが、 ContainingType::methodName は method reference 記法と呼ばれ、 ContainingType クラスのインスタンスを第1引数に取ってその methodName メソッド(N 引数)を呼ぶ N+1 引数の lambda として使えるようです。よって Value::getName(a) -> a.getName に等しいと思います。

(Update: 当初見間違えて Kotlin のつもりで回答しましたが、 Java に修正しました)

1Like

Comments

  1. @Natukasi

    Questioner

    そういうことか。第一引数がValueになるのですね。丁寧な説明をありがとうございました。おかげさまで理解できました

Your answer might help someone💌