【问题标题】:Converting ArrayList of objects to ArrayList of this objects String names in Java将对象的 ArrayList 转换为该对象的 ArrayList Java 中的字符串名称
【发布时间】:2010-08-14 14:28:49
【问题描述】:

我有一个用户对象的 ArrayList。现在我只需要这些用户名的 ArrayList。有没有办法在整个 ArrayList 上使用 toString() 并将其转换为字符串名称的 ArrayList 而不是在 for 循环中执行此操作?我还在 User 类中覆盖了 toString ,所以它返回了用户名,我试过 ArrayList <String> names = usersList.toString() 但它没有用。

【问题讨论】:

    标签: java arraylist tostring


    【解决方案1】:

    您可以使用Google Collections API

    List<User> userList = ...;
    List<String> nameList = Lists.transform(userList, new Function<User, String>() {
       public String apply(User from) {
          return from.toString(); // or even from.getName();
       }
    });
    

    该库已重命名为 Guava。


    使用 Java 8,即使不使用 Guava,您现在也可以使用流和方法引用来实现相同的目标:

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    
    class User {
    
        private String name;
    
        public User() {
        }
    
        public User(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    public class App {
        public static void main(String[] args) {
            List<User> users = new ArrayList<>(Arrays.asList(
                    new User("Alan Turing"),
                    new User("John von Neumann"),
                    new User("Edsger W Dijkstra")
            ));
    
            List<String> names = users
                    .stream()
                    .map(User::getName)
                    .collect(Collectors.toList());
    
            System.out.println(names);
        }
    }
    

    【讨论】:

    • 可以缩短为List&lt;String&gt; nameList = Lists.transform(userList, Functions.toStringFunction());,只要你坚持toString(而不是建议的getName)。
    • 如何将其转换为ArrayList&lt;String&gt; to ArrayList&lt;Object[]&gt;
    • @Subra: ArrayList&lt;String&gt; stringList = ...; ArrayList&lt;Object[]&gt; objectArrayList = Lists.transform(stringList, new Function&lt;String, Object[]&gt;() { public Object[] apply(String from) { return new Object[] { from }; } });
    • 谢谢。这太棒了。在没有这个的情况下花了 5 年的时间编写代码。
    • @sha 不客气! :) 我添加了一个版本,它使用了不再依赖于 Guava 的新 Java 8 功能。
    【解决方案2】:

    Object#toString() 返回 String,而不是 ArrayList。那是你的问题。你真的需要遍历它。绝对没有理由反对循环。如果代码以某种方式困扰您,只需将其隐藏在某种实用方法中即可;)


    借助 Java 8,您可以使用 lambda 表达式、流和方法引用来简化您的代码。

    以下

    List<User> users = getItSomehow();
    List<String> names = new ArrayList<String>();
    for (User user : users) {
        names.add(user.getName());
    }
    

    然后可以缩短为喜欢

    List<User> users = getItSomehow();
    List<String> names = users.stream().map(User::getName).collect(Collectors.toList());
    

    顺便说一句,您也可以将for 放在一行中:

    for (User user : users) names.add(user.getName());
    

    但是对于初学者来说可能无法直接理解。

    【讨论】:

    • BalusC:我更新了您的答案并添加了 Java 8 实现。最初,它提出了向 Java 7 添加闭包和 lambda 表达式的规范之一,但在最终引入 Java 8 时发生了显着变化。
    • @Behrang:是的,已经注意到它并修复了样式和错字。
    【解决方案3】:

    一句话:不。您需要的是一个map 函数,而Java 中没有该函数(正如BalusC 指出的那样)。您可以自己编写类似的内容,但无论如何,您最终都会遍历 List 中的每个元素。

    【讨论】:

      【解决方案4】:
      public ArrayList< String > toStringList( Collection< MyObject > objectList )
      {
          ArrayList< String > stringList = new ArrayList< String >();
      
          for( MyObject myobj : objectList ) {
              stringList.add( myobj.toString() );
          }
      
          return stringList;
      }
      
      ...
      
      ArrayList< String > myStringList = toStringList( objectList );
      

      那里。一行,您可以在将来的任何对象集合中重复使用它。

      【讨论】:

      • 我提到我想知道是否可以不使用 for 循环,例如 stringList.addAll(objectList.toString() )
      • @Mike55 为什么要避免 for 循环?即使您以不使用 for 循环的方式编写此代码,通过使用像 Guava 这样的库调用,在某些时候,某些代码仍必须访问列表中的每个元素以对其进行转换
      猜你喜欢
      • 1970-01-01
      • 2020-10-29
      • 2016-07-14
      • 2018-10-26
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多