如何将数据从一组对象复制到Java8中的不同对象的集合

时间:2016-02-02 12:56:07

标签: java collections java-8

我想使用函数式编程将数据从一个对象的集合复制到其他对象的集合。

我一直在阅读几本Java 8书籍并在线研究。我很确定我想使用stream(),但是我看到的每个例子总是迭代一个集合,对集合中的对象进行一些处理,并使用println()来输出内容。似乎没有人讨论如何处理如下所述的情况。

  1. 假设我们有以下对象:

    public class ObjectA
    {
        private String someData;
        private int moreData;
    
        public String getSomeData()
        {
           return someData;
        }
    
        public void setSomeData(String sData)
        {
           someData = sData;
        }
    
        public int getMoreData()
        {
           return moreData;
        }
    
        public void setMoreData(int mData)
        {
           moreData = mData;
        }
    }
    
    
    public class ObjectB
    {
       private String b_Data;
    
       public String getB_Data()
       {
          return b_Data;
       }
    
       public void setB_Data(String bData)
       {
          b_Data = bData;
       }
    }
    
  2. 我想创建一个ObjectB对象集合,其b_data属性等于ObjectAs集合中的someData属性。

  3. 下面的代码说明了一个相当不错的方法:

    public class Collector
    {
        public Collection<ObjectB> collectObjects(Collection<ObjectA> theAs)
        {
           // The use of an ArrayList is arbitrary. I might want to use any number
           // of different lists or even different collections!
           final Collection<ObjectB> theBs = new ArrayList<ObjectB>(); 
    
           for(ObjectA obj : theAs)
           {
               final ObjectB bobj = new ObjectB();
               bobj.setB_Data(obj.getSomeData());
    
               theBs.add(bobj);
           }
    
           return theBs;
       }
    }
    
  4. collectObjects()方法中的代码可以使用,但它使用命令式编程技术。我想知道如何使用功能技术来收集ObjectB。

    有没有办法使用溪流和lambdas来实现这一目标?

2 个答案:

答案 0 :(得分:3)

这种情况实际上完全适用于Stream API。你想要的是:

  1. 使用theAs.stream()制作一个Stream<ObjectA>输入列表的流。
  2. 使用Stream.map将流中的每个ObjectA映射到ObjectB
  3. 使用Stream.collect将结果与Collectors.toList()收集到一个新列表中。
  4. 这将是一个实现:

    public Collection<ObjectB> collectObjects(Collection<ObjectA> theAs) {
        return theAs.stream().map(obj -> {
            final ObjectB bobj = new ObjectB();
            bobj.setB_Data(obj.getSomeData());
            return bobj;
        }).collect(Collectors.toList());
    }
    

    当然,您可以创建一个以ObjectB为参数的obj.getSomeData()构造函数。它会简化代码,因为你可以写:

    public Collection<ObjectB> collectObjects(Collection<ObjectA> theAs) {
        return theAs.stream().map(obj -> new ObjectB(obj.getSomeData())).collect(Collectors.toList());
    }
    

    obj -> new ObjectB(obj.getSomeData())被称为lambda expression

答案 1 :(得分:1)

你可以这样做:

List<ObjectB> theBs = theAs
    .stream()
    .map(a-> {
        final ObjectB bobj = new ObjectB();
        bobj.setB_Data(a.getSomeData());
        return bobj;
    }).collect(Collectors.toList());

a -> { ... }构造是 lambda ,这是一种允许您将一些可执行代码传递给方法调用的构造。

在第二个例子中,lambda的主体直接来自循环体。