簡體   English   中英

Java泛型-將函數映射到列表

[英]Java generics - map function to a list


我是Java泛型的新手,並且遇到了這樣一個問題:假設您有自己的List實現,並且想提供一種使用某種映射(功能接口)同時轉換所有元素並收集的機制他們進入一個新列表。

盡管功能接口(在我的情況下為IMapper )的思想和用法是直截了當的,但我還不太想起執行映射的功能應具有的簽名嗎?

這是一個用例示例,也是我的想法。 不幸的是,它不能正常工作,主要問題是:在這種情況下應如何傳遞第二個V參數類型?

public interface IMapper<T,V> { V map(T v); }

public class MyList<T> extends ArrayList<T> {
  public MyList<V> map(IMapper <T,V> mapper) {
    MyList<V> list = new MyList<>();
    for(T v : this) {
      list.add(mapper.map(v));
    }
    return list;
  }
}
// in main
MyList<Integer> list1 = new MyList<>(); 
// fill etc..
IMapper<Integer,String> m = (i) -> { return i.toString(); };
// "Change" list
MyList<String> list2 = list1.map(m);

PS:我認為這樣的事情很可能已經在Java中實現了( stream()以及我猜得出的是什么?),但是它應該對我來說是練習。 任何提示將不勝感激:)

您可以在地圖方法上將通用參數定義為類型參數。 像這樣:

public <V> MyList<V> map(IMapper <T,V> mapper) {
    ...
}

類型參數可以通過兩種方式定義,分別在類或方法上。 如果是在類上定義的,則可以在整個類中使用它。 如果在方法上定義,則只能在該方法中使用。

在您的情況下,可以在類上定義T參數,而可以在方法上定義V參數。

您可以將地圖結果類型添加到函數定義中,如下所示:

class MyList<T> extends ArrayList<T> {

public <V> MyList<V> map(IMapper<T, V> mapper) {
    MyList<V> list = new MyList<>();
    for (T v : this) {
        list.add(mapper.map(v));
    }
    return list;
}

}

例:

MyList<Integer> number = new MyList<>();

number.add(1);
number.add(2);
number.add(3);

number.map(v -> "#" + v).forEach(System.out::println);

使用Java8流,您可以獲得相同的結果,如下所示:

List<Integer> numberStream = new ArrayList<>();
numberStream.add(1);
numberStream.add(2);
numberStream.add(3);
numberStream.stream().map(v -> "#" + v).forEach(System.out::println);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM