流,地图,减少...它是如何完成的?

时间:2014-08-03 14:13:18

标签: java mapreduce java-8 java-stream

我正试图让我的头脑进入Java 8流,但仍然时不时地陷入困境。我目前有一个问题,我知道它可以用流完成,我似乎无法理解如何正确使用它们。

我有一个字符串A列表,并尝试通过某个规则查找A的所有元素a与A的另一个元素b匹配,然后使用所有a - &gt;创建一个Map<String, List<String>>。所有匹配的b。

详细说明:

  • 对于A中的每个a,使用谓词P与A中的每个b进行比较。
  • 如果P(a,b)匹配,则从a和b生成一对(x,y)。
  • 按x对所有对进行分组并返回为地图。

你能给我一个有用的Java 8流示例吗?

编辑:我将如何以不必要的昂贵方式进行此操作:

Pairs(x,y) = forEach(a,b in A) 
  where (a != b && P(a, b)) 
  generatePairXY(a, b)
Map(x -> List(y)) = group(Pairs(x,y)) by x

这种方法的问题在于我首先需要构建一个庞大的对列表,其中 - 考虑到我的数百万字的数据集 - 会耗尽内存。

1 个答案:

答案 0 :(得分:4)

List<String> list = ...;
Map<String, List<String>> map = 
  list.stream()
      .collect(Collectors.toMap(a -> a, a -> list.stream()
                                                 .filter(b -> P(a,b))
                                                 .collect(Collectors.toList()))
               );

我们的想法是创建一个映射,其中包含原始列表的每个String的键,以及一个值,该值是与该键匹配的所有字符串的筛选列表。

编辑:

这是一个完整的工作示例,如果两个字符串不相等但长度相同,则谓词P返回true:

package com.test;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Test
{

  public static boolean P (String a, String b)
  {
    return a.length() == b.length() && !a.equals(b);
  }

  public static void main (String[] args)
  {
    List<String> list = new ArrayList<String>();
    list.add ("aaa");
    list.add ("bbb");
    list.add ("ccc");
    list.add ("cccc");
    list.add ("dddd");
    list.add ("ddd");

    Map<String, List<String>> map = 
      list.stream()
          .collect(Collectors.toMap(a -> a, a -> list.stream()
                                                     .filter(b -> P(a,b))
                                                     .collect(Collectors.toList()))
               );
    for (String key : map.keySet ()) {
      System.out.print (key + ": " );
      for (String value : map.get(key)) {
        System.out.print (value+ " ");
      }
      System.out.println("");
    }
  }

}

输出:

aaa: bbb ccc ddd
ccc: aaa bbb ddd
bbb: aaa ccc ddd
ddd: aaa bbb ccc
dddd: cccc
cccc: dddd
相关问题