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

标签 java list generics

我如何在 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>每个 AM<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/

相关文章:

java - Out.Print 方法不起作用?

python - 将二维列表中的每个项目乘以Python中的标量

java - 为什么我得到了错误的列表?

java - Gson将泛型列表反序列化为泛型方法

c# - 如何获取 C# 中泛型约束的有效类型对象?

java - 如何修复这个竞争条件错误?

java - "Multiple markers at this line"

c++ - 我在显示链接列表时遇到问题

java - 枚举如何管理泛型?

java - java类中的run或main函数有什么区别