当前位置: 首页 > 面试题库 >

Java中类似Python的列表理解

唐睿
2023-03-14
问题内容

由于Java不允许将方法作为参数传递,因此您使用什么技巧来实现Python(如Java中的列表理解)?

我有一个字符串列表(ArrayList)。我需要通过使用函数来转换每个元素,以便获得另一个列表。我有几个函数,它们将一个String作为输入,并返回另一个String作为输出。如何制作一个可以将列表和函数作为参数的通用方法,这样我就可以在处理完每个元素后获取列表。从字面上看这是不可能的,但是我应该使用什么技巧?

另一个选择是为每个较小的String处理函数编写一个新函数,该函数仅循环遍历整个列表,这并不是那么酷。


问题答案:

基本上,您可以创建一个Function接口:

public interface Func<In, Out> {
    public Out apply(In in);
}

然后将匿名子类传递给您的方法。

您的方法可以将函数就地应用于每个元素:

public static <T> void applyToListInPlace(List<T> list, Func<T, T> f) {
    ListIterator<T> itr = list.listIterator();
    while (itr.hasNext()) {
        T output = f.apply(itr.next());
        itr.set(output);
    }
}
// ...
List<String> myList = ...;
applyToListInPlace(myList, new Func<String, String>() {
    public String apply(String in) {
        return in.toLowerCase();
    }
});

或创建一个新的List(基本上创建从输入列表到输出列表的映射):

public static <In, Out> List<Out> map(List<In> in, Func<In, Out> f) {
    List<Out> out = new ArrayList<Out>(in.size());
    for (In inObj : in) {
        out.add(f.apply(inObj));
    }
    return out;
}
// ...
List<String> myList = ...;
List<String> lowerCased = map(myList, new Func<String, String>() {
    public String apply(String in) {
        return in.toLowerCase();
    }
});

哪一种更好取决于您的用例。如果您的清单很大,则就地解决方案可能是唯一可行的解​​决方案。如果您希望对同一原始列表应用许多不同的功能以制作许多派生列表,则需要使用该map版本。



 类似资料:
  • 问题内容: 我希望能够使用类似数组的语法访问python对象的某些值,即: 这可能吗?如果是这样,您如何在相关的python类中实现此功能? 问题答案: 你需要写或重写,和。 因此,例如: 这是一个非常简单的类,允许对其属性进行索引访问。

  • 本文向大家介绍Python将列表中的类似子字符串分组,包括了Python将列表中的类似子字符串分组的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将编写一个程序,该程序将列表中的相似子字符串分组。让我们看一个例子来更清楚地理解它。 输入值 输出结果 我们将使用itertools模块中的groupby方法来解决该问题。该GROUPBY方法组中的所有类似的字符串转换为ITER对象。对于给定的

  • 问题内容: 加入列表: join 必须采取迭代。 显然,join的论点是,这是一个列表理解。 看这个: 现在,join的参数为,但结果相同。 为什么?是否str还会产生列表或可迭代项? 问题答案: 这称为生成器表达式,并在PEP 289中进行了说明。 生成器表达式和列表理解之间的主要区别在于前者不在内存中创建列表。 请注意,还有第三种编写表达式的方法:

  • 问题内容: 如何在Python中执行以下操作? 实质上: 用空字符串替换所有的None,然后 执行功能。 问题答案: 你可以完全做到这一点,这只是一个订购问题: 一般来说, 而且,if仅对于具有条件的列表理解而言, 请注意,这实际上使用了一种不同的语言构造,即条件表达式,它本身不是理解语法的一部分,而ifafter则for…in是列表理解的一部分,用于从可迭代的源中筛选元素。 条件表达式可用于各种

  • 问题内容: 是否可以在Python中定义递归列表理解? 可能是一个简单的示例,但类似于: 这样有可能吗? 问题答案: 不,没有(记录,可靠,稳定,… ;-)引用“当前理解”的方法。您可以只使用一个循环: 当然,这是非常昂贵的(O(N平方)),因此您可以使用辅助工具对其进行优化(我假设将项目的顺序与中的项目顺序保持一致,否则可以做到;-)。 ..: 对于非常长的列表(O(N)而不是N平方),这要快得

  • 问题内容: 如何从类定义中的列表理解中访问其他类变量?以下内容在Python 2中有效,但在Python 3中失败: Python 3.2给出了错误: 尝试Foo.x也不起作用。关于如何在Python 3中执行此操作的任何想法? 一个稍微复杂的激励示例: 在此示例中,apply()这是一个不错的解决方法,但可悲的是它已从Python 3中删除。 问题答案: 类范围和列表,集合或字典的理解以及生成器