我如何在 Java 中编写一个静态方法来接受一个 List,对每个元素执行一个操作,然后返回结果(当然不影响原来的结果)?
例如,如果我想为每个元素加 2,... 这里的内容是什么?具体返回类型必须相同,例如如果我的列表是一个值为 1、2、3 的 LinkedList,我应该取回一个值为 3、4、5 的 LinkedList。 ArrayList、Vector、Stack等也是类似,都是List。
我可以看到如何使用多个 if (lst instanceof LinkedList) ...
等...有更好的方法吗?
import java.util.List;
public class ListAdd {
static List<Integer> add2 (List<Integer> lst) {
...
return result;
}
}
最佳答案
已经有很多答案,但我想向您展示一种思考这个问题的不同方式。
您要执行的操作称为 map
在函数式编程的世界里。这是我们一直在用函数式语言做的事情。
让M<A>
是某种容器(在您的情况下,M
将是 List
,而 A
将是 Integer
;但是,容器可以是很多其他东西)。假设您有一个函数 可以转换 A
进入B
s,即f: A -> B
.让我们把这个函数写成 F<A, B>
类型, 使用更接近 Java 的符号。请注意,您可以拥有 A = B
,如您给出的示例(其中 A = B = Integer
)。
然后,操作map
定义如下:
M<B> map(M<A>, F<A, B>)
也就是说,该操作将返回一个 M<B>
,大概是通过应用 F<A, B>
每个 A
在M<A>
.
在实践中...
Google 开发了一个很棒的库,叫做 Guava ,它为 Java 带来了很多函数式习语。
在 Guava 中,map
操作称为 transform
, 它可以在任何 Iterable
上运行.它还具有更具体的实现,可直接在列表、集合等上工作。
使用 Guava,您要编写的代码如下所示:
static List<Integer> add2(List<Integer> ns) {
return Lists.transform(ns, new Function<Integer, Integer>() {
@Override Integer apply(Integer n) { return n + 2; }
}
}
就这么简单。
这段代码不会触及原始列表,它只会提供一个新列表,根据需要计算其值(也就是说,除非需要,否则不会计算新创建列表的值——它被称为 < em>惰性操作)。
作为最后的考虑,您不可能绝对确定您将能够返回完全相同的 List 实现。正如许多其他人指出的那样,除非有非常具体的原因,否则您不应该真正关心。这就是为什么 List 是一个接口(interface),您不关心实现。
关于java - 如何对 List 的每个元素执行操作并返回结果(当然不影响原始结果)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6604368/