将Collection <myclass>转换为Collection <string>

时间:2017-01-12 20:13:27

标签: java collections apache-commons anonymous-class

我尝试在功能上与CollectionUtils transform (Apache Commons Collections)

类似
class CollectionUtils {

    public static void transformerModifier(Collection<MyClass> myCollection) {
        // How should I implement this method in order that 
        // output from the line 1 and line 2 will be the same ? 
    }

    public static List<String> transform(Collection<MyClass> myCollection) {
        List<String> strCollection = new LinkedList<>();
        for (MyClass item : myCollection) {
            strCollection.add(item.getName());
        }
        return strCollection;
    }
}

class myClass { 
    private String name; 
    private int value; 

    myClass( String name, int value) {
        this.name = name ; 
        this.value = value; 
    }

    public String toString(){
        return new String(name+ ":" + value ) ; 
    }
}

class MyClassCollection{
    private List<myClass> list ; 

    myClassCollection(List<myClass> list){
        this.list = list; 
    }

    List<myClass> collection(){
        return list.clone(); 
    }

}

public class TestClass{

    public static void main (String[] args) {

        List<MyClass> list = new ArrayList<>(); 
        list.add(new myClass("John", 12);
        list.add(new myClass("Mike", 16);
        list.add(new myClass("Eric", 13);
        list.add(new myClass("Mark", 142);
        list.add(new myClass("Alex", 112);

        MyClassCollection myOjb = new MyClassCollection(list );
        CollectionUtils.transformerModifier(myObj.collection() ); 
        List<MyClass> myList = CollectionUtils.transform(myObj.collection()); 
        System.out.println(Arrays.toString(myObj.collection().toArray)); // line 1
        System.out.println(Arrays.toString(myList.toArray));            // line 2
    } 

}

output: [John,Mike,Eric,Mark,Alex] // output after line 1 
output: [John,Mike,Eric,Mark,Alex] // should be output after line 2 

我的问题是有可能以改变对象myObj的集合的方式实现方法transformerModifier,以便myObj.collection()不返回List<myClass>而是返回List<String>的列表(其中)字符串是来自private String name的{​​{1}}数据成员的数据?

我的猜测是解决方案应该通过匿名类。但是,我还没有理解我应该如何实现它。

2 个答案:

答案 0 :(得分:3)

如果您使用的是Java 8,则可以使用streammap()来执行以下操作:

List<MyClass> myClassList = new ArrayList<>();
//add your items to myClassList here

List<String> names = myClassList.stream().map(MyClass::getName).collect(Collectors.toList());
//names will now consist of a List of all the names associated with
//each of the MyClass objects within myClassList in the same order

此解决方案也使用方法参考MyClass::getName。这会调用getName stream中每个对象的map方法,使用.map()将其ping到转换后的流中的相应位置。

接下来,它使用.collect()使用stream将其从list恢复为Collectors.toList()

如果您正在使用myClassList中的大量对象,则可以使用.parallelStream()代替.stream()加快此过程,但如果您不使用大量的.parallelStream()数据,您可能会看到List的效果下降。这一切都取决于您期望在{{1}}中出现的对象数量。

答案 1 :(得分:0)

public interface Converter<I, O> {

    void tranformer(List list);

    O retriever(I obj);
}

_

  public static <I, O> void transform(Converter<I, O> converter, List inputList) {
        Iterator<I> it = inputList.iterator();
        List list = new LinkedList<>();
        while (it.hasNext()) {
            list.add(converter.retriever(it.next()));
        }
        converter.tranformer(list);
    }

_

    public static void main(String[] args) {
       List<MyClass> list = new ArrayList<>(); 
        list.add(new myClass("John", 12);
        list.add(new myClass("Mike", 16);
        list.add(new myClass("Eric", 13);
        list.add(new myClass("Mark", 142);
        list.add(new myClass("Alex", 112);

        MyClassCollection myclasscollection = new MyClassCollection(list); 
        final List collectionList = myclasscollection.collection(); 
        CollectionUtils.transform(new Converter<myClass, String>() {
            @Override
            public void tranformer(List list) {
                employeeList.clear();
                employeeList.addAll(list);
            }

            @Override
            public String retriever(myClass obj) {
                return obj.name; // make the data member public or add getter 
            }
        }, collectionList);

 collectionList.get(0).toString.toLowerCase(); 

}

这并不是你所需要的,但我敢打赌,这不是一个不错的选择。请注意,输出集合collectionList将是对象的集合(而不是String),但是,您可以像这样collectionList.get(0).toString.toLowerCase();正确地访问String数据类型的方法。希望这个帮助。