首页 > 解决方案 > 使用 Java Stream 将 map 方法的参数添加到 foreach 方法

问题描述

我写了一个小例子来解释我的问题:

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");
    }

标签: javaforeachjava-8java-stream

解决方案


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

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

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

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

  1. 您将流链替换为一个简单的循环,其中每个中间计算都可以访问。

我发现最后一种方法是最简单和性能方面的。您似乎不会从这里的流中获得任何好处。我会坚持下去。


推荐阅读