gpt4 book ai didi

Java 泛型 - 将函数映射到列表

转载 作者:行者123 更新时间:2023-11-30 07:48:29 29 4
gpt4 key购买 nike


我是 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);

附言:我认为这样的事情很可能已经在 J​​ava 中实现了(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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com