简体   繁体   English

获取ArrayList <String> 从ArrayList <CustomClass> (LF方法将字符串数据作为数组而不是foreach返回)

[英]Get the ArrayList<String> from ArrayList<CustomClass> (LF method to return string data as array instead of foreach)

Here's my custom Class (for readability I translated names and left away constructor etc) 这是我的自定义Class (出于可读性,我翻译了名称并保留了构造函数等)

public class MyClass {
    private long id;
    private String name, description;
    private int pictureId;
    ...
}

So I use this Class to store all data as an ArrayList<MyClass> 因此,我使用此类将所有数据存储为ArrayList<MyClass>

ArrayList<MyClass> items = getResources(); //fills the arraylist

I'd like to return all it's names. 我想返回所有的名字。

Is it possible to write a custom method like ArrayList<String> names = items.getAllNames(); 是否可以编写自定义方法,例如ArrayList<String> names = items.getAllNames(); ? Because I have not idea where to put the logic to address the ArrayList and not the Class . 因为我不知道在哪里放置逻辑以寻址ArrayList而不是Class

getAllNames()
{
    for (MyClass item : items){
        names.add(item.getName());
    }
}

Putting foreach lines everytime I need something from the ArrayList works, but it looks so messy. 每当我需要ArrayList中的内容时都放置foreach行,但是看起来很乱。 Is there a clean way to solve this? 是否有解决此问题的干净方法?

You'll have to create a method which iterates over all elements in your arraylist and adds every name to a second list which you'll return. 您必须创建一个方法,该方法可以对arraylist中的所有元素进行迭代,并将每个名称添加到要返回的第二个列表中。 I haven't read into lambda expressions for Java yet, but if I recall anything from my C# experience then you might be able to do this with Java 8. 我还没有读懂Java的lambda表达式,但是如果我从C#经验中忆起任何事情,那么您也许可以使用Java 8做到这一点。

public List<String> getNames(){
  List<String> names = new ArrayList<>();
  List<MyClass> elements = getElements();

  for(MyClass s : elements){
     names.add(s.getName());
  }

  return names;
}

You have to provide getters of your custom class MyClass and I use List interface as a returned type instead of ArrayList as it is more flexible. 您必须提供自定义类MyClass的吸气剂,并且我使用List接口作为返回类型而不是ArrayList,因为它更灵活。
You can try this one and let me know in case of any concern. 您可以尝试这一方法,如有任何疑问,请通知我。
Please find the code snippet: 请找到代码片段:

 import java.util.ArrayList;
 import java.util.List;
   class Test{

        private List<MyClass> getResources() {
            // TODO Auto-generated method stub
                // Use your business logic over here
              ----------------------------------
            return new ArrayList<MyClass>();
        }
        // This is your method which will returns all the names
        public List<String> getAllNames(){
            List<String> names = new ArrayList<String>();
            List<MyClass> items = getResources();
            for (MyClass myClass : items) {
                names.add(myClass.getName());
            }
            return names;
        }
    }

Here is your bean class MyClass, I just added getters and setters over here. 这是您的bean类MyClass,我只是在这里添加了getter和setters。

    public class MyClass {
        private long id;
        private String name;
        private String description;
        private int pictureId;

        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }


     -------------------------------------
    }

try to follow this structure : 尝试遵循以下结构:

public class MyClass {
        private long id;
        private String name, description;
        private int pictureId;
        ...
    }

    public class Itemlist {
        public ArrayList<MyClass> items = new ArayList<MyClass>();

    public ArrayList<String> getAllNames()
    {
        ArrayList<String> names= new ArrayList<String>();
        for (MyClass item : items){
            names.add(item.getName());
        }
    return names;
    }

There are two obvious solutions, one is an intermediate class, say ClassList, that contains a private ArrayList of MyClass and methods to operate on same. 有两种明显的解决方案,一种是中间类,例如ClassList,它包含MyClass的私有ArrayList和对其进行操作的方法。 Especially useful if you will need more than just an iterator. 如果您需要的不仅仅是迭代器,则特别有用。 The other solution is to put the iterator code in the MyClass class itself. 另一种解决方案是将迭代器代码放在MyClass类本身中。 Here is using an intermediate class. 这里使用的是中间类。

public ClassList {
    ArrayList<MyClass> list = null;

    public void ClassList () {
        if (list == null)
            list = new ArrayList<MyClass> ();
    }


    public ArrayList<String> getAllNames(ArrayList<MyClass> fred) {

        ArrayList<String> names = new ArrayList<String>();

        for (MyClass fred : items) {
            names.add(items.getName());
        }
        return names;
    }
}

Looks like Milan added an example of doing it inside the MyClass class. 米兰似乎在MyClass类中添加了一个示例。 So there's another way. 因此,还有另一种方式。

If you can import Apache common utility package, then it can be this: 如果可以导入Apache通用实用程序包,则可以是这样:

    List<String> fieldsValues=
(List<String>)CollectionUtils.collect(beanLs,new BeanToPropertyValueTransformer("fieldNameInBean"));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM