如何对List的每个元素执行操作并返回结果(当然不影响原始结果)? - java

如何用Java编写一个静态方法,该方法将获取一个List,对每个元素执行一个操作,然后返回结果(当然不影响原始结果)?

例如,如果我想为每个元素加2,那么...这里会是什么?具体的返回类型必须相同,例如如果我的列表是值为1,2,3的LinkedList,则应该返回值为3,4,5的LinkedList。 ArrayList,Vector,Stack等都是列表。

我可以看到如何使用多个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的函数,即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>

在实践中...

谷歌开发了一个出色的库,称为Guava,它为Java带来了很多功能。

在Guava中,map操作称为transform,它可以在任何Iterable上操作。它还具有可直接用于列表,集合等的更具体的实现。

使用番石榴,您要编写的代码如下所示:

static List<Integer> add2(List<Integer> ns) {
  return Lists.transform(ns, new Function<Integer, Integer>() {
    @Override Integer apply(Integer n) { return n + 2; }
  }
}

就那么简单。

这段代码不会涉及原始列表,它只会提供一个新列表,该列表将根据需要计算其值(也就是说,除非需要,否则不会计算新创建列表的值-这称为惰性操作)。

最后要考虑的是,您不可能完全确定您将能够返回完全相同的List实现。正如许多其他人所指出的那样,除非有非常特殊的原因,否则您根本不需要在意。这就是为什么List是一个接口,而您不关心实现的原因。

为什么我不能在Java中重写方法wait()? - java

Improve this question 我在类wait()中找到了方法Object。这是最终的,这意味着该方法不能被覆盖。有什么想法为什么是最终的? 参考方案 @Flavio-这实际上是一个很好的问题。当然,您不能覆盖它的原因是设计师将其“确定为最终”。做出此决定的一些潜在原因:您不希望人们弄乱基本类(“对象”类)上基本操作的语义。由于它是“最终的”,因…

Web应用程序上的恶意用户是否可以操纵Web应用程序前端发送的输入(在表单数据旁边)? - java

Web应用程序上的恶意用户是否可以通过任何可能的方式来操纵Web应用程序前端发送的输入(当然,这不是在谈论FORM DATA),但是发送的请求例如当我允许他编辑他的个人资料或他的内容时,他可能会操纵ID(userId或contentId),从而可能恶意地对其他用户的内容进行邪恶?这些输入固定在网页上并且不可编辑,但用户仍然可以操纵它们吗?用户是否可能以这种方…

什么时候在Hibernate中调用flush()和commit()? - java

我有以下情况: openSession() tx = session.beginTransaction(); try { ... session.saveOrUpdate(obj_1); ... session.saveOrUpdate(obj_2); ... session.saveOrUpdate(obj_3); session.flush(); tx.…

如果没有它,为什么还要使用collect(Collectors.toList())? - java

我在许多Java 8参考资料和示例中都看到了以下代码:List <Integer> l = Arrays.asList(7, 3, 9, 8, 6, 5, -1, -100); l.stream().filter(y -> y <l.get(0)).collect(Collectors.toList()). forEach(Syste…

递归使用多少堆栈(从列表中删除节点)? - java

更新:请注意,这个问题并没有多大意义,因为调用栈将独立于类型T增长。调用栈仅取决于要处理的列表中节点的数量-这些节点中包含的数据无效在调用堆栈的大小上。假设我有一个“ remove-node-from-list”方法的递归java实现,如下所示:// head public void remove(T data) { if (data == null) th…