作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Java 中泛型的新手,我遇到过这样的问题:假设你有自己的 List 实现,你想提供一种机制来使用某种映射(功能接口(interface))同时转换所有元素并收集他们进入一个新的列表。
虽然函数式接口(interface)(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);
附言:我认为这样的事情很可能已经在 Java 中实现了(stream()
,我猜接下来会发生什么?)但是它应该是我的练习。任何提示将不胜感激:)
最佳答案
您可以将 map 结果类型添加到您的函数定义中,如下所示:
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);
关于Java 泛型 - 将函数映射到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49219656/
我是一名优秀的程序员,十分优秀!