【问题标题】:Efficient way to iterative Java Collection and doing some transformation on element迭代Java Collection并对元素进行一些转换的有效方法
【发布时间】:2015-02-03 19:24:26
【问题描述】:

我想知道是否有一些有效的方法来迭代 Java 对象集合并进行一些转换。这是我经常看到的一个例子:

 public class MyObject {
    int data;

    public void run() {
        doTransform();
    }
    .....
}

public class Main {
    public static void main(){
        Set<MyObject> objs=..
        for(MyObject obj: objs){
            if(obj.getData() && other conditions ){
               obj.run();                
           }

       }
       //The iterator are also frequently used here ..
   }
}

就我个人而言,我不喜欢 main 方法中显示的这种方式,因为它需要更多的键入代码并且代码不是那么干净……我更喜欢 C++ 中使用的方式(只有一行代码)。上面的例子是:

 for_each(obj.begin(), obj.end(), a fun object);  

【问题讨论】:

  • 我很好奇你认为这个“不那么干净”的原因。仅仅因为代码在一行并不能使它“更干净”。

标签: java c++ collections iterator


【解决方案1】:

在 Java 8 中,您可以这样做:

objs.stream()
    .filter(o -> o.hasData() && other conditions)
    .forEach(MyObject::run);

很难想象比这更简洁的东西(至少在可读性强的时候!)。以下是它更深入的功能:

  • 第一行为您的Set&lt;MyObject&gt; 创建一个Stream&lt;MyObject&gt;
  • 第二行将其转换为只允许元素o 的流,例如o.hasData() &amp;&amp; other conditions
    • 这对应于循环中的if
  • 最后,第三行调用run 方法。
    • MyObject::run 只是o -&gt; o.run() 的简写,其中o 的类型为MyObject。)

【讨论】:

  • 对于 Java 7 及以下版本,您所拥有的几乎是最好的。
猜你喜欢
  • 2012-02-03
  • 2019-03-29
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 2016-07-07
相关资源
最近更新 更多