【问题标题】:is it possible to modify all elements of a list in java?是否可以在java中修改列表的所有元素?
【发布时间】:2011-09-14 20:08:30
【问题描述】:

我有一个Strings 列表,我想对列表中的所有Strings 执行相同的操作。

是否可以不执行循环?

【问题讨论】:

    标签: java list arraylist


    【解决方案1】:

    您可以递归地执行此操作,但我不明白您为什么要这样做。你也许能找到类似于 Python 的 map 函数的东西(在幕后,它可能是一个循环或递归方法)

    另请注意,字符串是不可变的 - 所以无论如何您都必须创建“副本”。

    【讨论】:

      【解决方案2】:

      没有。您必须遍历列表。

       for(String s:yourlist){
             dooperation(s);
       }
      

      【讨论】:

        【解决方案3】:

        抱歉,您必须以某种方式遍历列表,最好的方法是循环。

        【讨论】:

          【解决方案4】:

          有些东西必须在某个地方循环——如果你想将它抽象到你自己的方法中,你可以这样做,但我不相信框架中内置了任何东西。

          GuavaIterables 中有各种方法来执行投影等,但如果你想修改每一步的列表,我不确定是否有任何支持。同样,如果您愿意,您可以编写自己的方法(非常简单)。

          当 Java 最终获得闭包时,这种事情会变得更加合理 - 目前,不幸的是,与硬编码循环相比,指定“某物”操作通常比它值得付出更多的努力。

          【讨论】:

          • closures 中的When Java eventually gets closures 是什么意思?
          • @foampile:嗯,闭包在 Java 中已经以匿名类的形式存在,但是 Java 8 中的 lambda 表达式会让它们更受欢迎。如果您不知道闭包是什么,那么在评论中解释会花费很长时间 - 我建议您搜索网络。
          【解决方案5】:

          不,您必须为此使用循环。

          【讨论】:

            【解决方案6】:

            根据您所说的无循环,这可能会让您感兴趣: java的map函数。

            http://www.gubatron.com/blog/2010/08/31/map-function-in-java/

            ...里面还有一个循环。

            【讨论】:

              【解决方案7】:

              必须对List中的Strings的每个引用变量进行操作,所以需要循环。

              如果是List级别,显然有一些操作(removeAll等)。

              【讨论】:

                【解决方案8】:

                在 Java 中,您需要遍历 Collection 中的元素并应用该方法。我知道 Groovy 提供了 * 语法来做到这一点。您可以为您的功能创建一个接口,例如使用 apply 方法并编写一个方法,该方法采用您的 Collection 和包含要应用的函数的接口,如果您想添加一些通用 API 来执行此操作。但是你需要在某个地方进行迭代!

                【讨论】:

                  【解决方案9】:

                  为什么不想执行循环?

                  如果是计算复杂度,那么不,这是不可避免的。所有方法基本上都归结为迭代列表中的每个项目。

                  如果是因为您想要更清洁的东西,那么答案取决于您认为更清洁的东西。有各种库添加了某种形式的功能映射,最终会是这样的:

                  map(list, new Mapper<String, String>() {
                      public String map(String input) {
                          return doSomethingToString(input);
                      }
                  );
                  

                  这显然比简单的循环更加冗长和复杂

                  for (int i = 0; i < list.size(); i += 1) {
                      list[i] = doSomethingToString(list[i]);
                  }
                  

                  但它确实提供了可重用性。

                  map(list, new DoSomethingToStringMapper());
                  map(otherlist, new DoSomethingToStringMapper());
                  

                  但可能你不需要这个。一个简单的循环将是要走的路。

                  【讨论】:

                    【解决方案10】:

                    你可以使用apache commons util

                    【讨论】:

                    • 链接已损坏,我无法弄清楚如何正确格式化 url 以获得答案。答案指向 CollectionUtils.forAllDo(java.util.Collection collection, Closureclosure)
                    【解决方案11】:

                    在多线程遍历中使用分而治之。确保返回新的/不可变的转换集合对象(如果你想避免并发问题),然后你最终可以合并(可能正在使用另一个线程,在所有工作线程完成划分列表上的转换器任务后唤醒?) . 如果在创建这些中间集合时内存不足,则在源集合上进行同步。这是你能做的最好的。

                    【讨论】:

                    • 当给出这样一个抽象而复杂的答案时,一个例子会有很长的路要走。
                    【解决方案12】:

                    已接受的答案链接已损坏,所提供的解决方案已弃用:

                    CollectionUtils::forAllDo

                    @Deprecated

                    public static &lt;T,C extends Closure&lt;? super T&gt;&gt; C forAllDo(Iterable&lt;T&gt; collection, C closure)

                    已弃用。从 4.1 开始,请改用 IterableUtils.forEach(Iterable, Closure)

                    对集合中的每个元素执行给定的闭包。 如果输入集合或闭包为空,则不进行任何更改。


                    你可以使用IterableUtils::forEach(Closure c)

                    将闭包应用于提供的可迭代对象的每个元素。

                    【讨论】:

                      【解决方案13】:

                      java API 提供了特殊的类来存储和操作对象组。一个这样的类是 Arraylist

                      注意 Arraylist 类在 java.util.ArrayList

                      像创建任何对象一样创建一个 ArrayList。

                      import java.util.ArrayList;
                      //..
                      ArrayList ajay = new ArrayList(); 
                      

                      这里

                      • ArrayList -> 类

                      • ajay -> 对象

                      您可以选择指定 Arraylist 将容纳的对象的容量和类型:

                      ArrayList ajay<String> = new ArrayList<String>(10);
                      

                      Arraylist 类提供了许多有用的方法来操作对象..

                      add() 方法将新对象添加到 ArrayList。而 remove() 方法从 List 中删除对象..

                      示例代码:

                      import java.util.ArrayList;
                      
                      public class MyClass {
                          public static void main(String[ ] args) {
                              ArrayList<String> ajay = new ArrayList<String>();
                              ajay.add("Red");
                              ajay.add("Blue");
                              ajay.add("Green");
                              ajay.add("Orange");
                              ajay.remove("Green");
                      
                              System.out.println(colors);
                          }
                      }
                      

                      此代码的输出:

                      [Red,Blue,Orange]
                      

                      【讨论】:

                        猜你喜欢
                        • 2021-01-20
                        • 2020-11-02
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2021-10-31
                        • 1970-01-01
                        • 1970-01-01
                        • 2019-12-22
                        相关资源
                        最近更新 更多