繁体   English   中英

使用Java Stream将map方法中的参数添加到foreach方法中

[英]adding an argument from the map method to the foreach method using Java Stream

我写了一个小例子来说明我的问题:

import java.util.Arrays;
import java.util.List;


public class Example {

     public static void main( String[] args )  {
         String [] array =  {"1 0101 5","1 0101 5"};
         Arrays.stream(array)
               .map(str->str.split(" "))//every String is mapped to an array of String
               .map(arr-> returnAListOf5Element( Integer.parseInt(arr[0]),arr[1],Integer.parseInt(arr[2])))
               .forEach(list-> tesMyList(list));//i want to send the Integer.parseInt(arr[2]) as a second argument
     }
    /**
     *
     * test if the list has size of 5
     */
    private static void testMyList(List<Integer> myList) {
         if (myList.size()==5)
             System.out.println("Ok");
    }

    /**
     *
     * return a list of 5 element
     * @return
     */
    private static List<Integer> returnAListOf5Element( int i, String s, int i1 ) {
         List list = Arrays.asList(1,2,3,4,5);
         return list;
    }
}

所以我有一些字符串,例如“ 1 0101 5”,“ 1 0101 5” .....,我使用流操作进行计算。

问题是我想将map方法中找到的参数arr [2]添加到foreach方法中找到的testMyList方法中。

方法testMyList应该类似于:

 private static void testMyList(List<Integer> myList, int size) {
         if (myList.size()==size)
             System.out.println("Ok");
    }

我可以看到三种可能的解决方案:

  1. returnAListOf5Element返回列表中的arr[2] (通过联系,它是返回列表中的最后一个元素。) 这是一种肮脏的方法。

  2. map返回一个Map.Entry<List<Integer>, Integer> ,它由returnAListOf5Element(...)调用和arr[2]的结果组成。 这是一种更合理的方法。

这两个想法基于上一个操作的缓存状态,因此您可以在下一个操作中使用它。 这是获得之前在链中计算的结果的唯一方法。

  1. 您可以通过一个简单的循环替换流链,在该循环中可以访问每个中间计算。

我发现最后一种方法最简单且性能最佳。 看来您不会从这里的流中获得任何好处。 我会坚持下去。

创建您自己的类来维护数据,而不是使用诸如List类的通用类。

class MyObject {
    public final int i;
    public final String string;
    public final int i1;
    public MyObject(int i, String string, int i1){
        this.i = i;
        this.string = string;
        this.i1 = i1;
    }
    public static MyObject parse(String line) {
        String[] split = line.split(" ");
        return new MyObject(Integer.parseInt(split[0], split[1], Integer.parseInt(split[2]);
    }
}

那你可以做

Files.lines(filename)
     .map(MyObject::parse)  // now you have a Stream of MyObjects
     .forEach(o -> verify(o));

与例如

void verify(MyObject object) {
    if (object.i1 < 5) {
        System.out.println("invalid");
    }
}

暂无
暂无

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

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