【问题标题】:Understanding stream.map in java [duplicate]了解java中的stream.map [重复]
【发布时间】:2017-01-07 16:23:52
【问题描述】:

我在 java 中启动了一些 SQL 查询,它会返回一些看起来像这样的数据:

[ID,Description,WhateverColumn,...,...,ImportantNumber]

示例:

[1,"Desc",...,...,1]

[1,"Desc",...,...,2]

[1,"Desc",...,...,3]

[2,"Desc",...,...,1]

[3,"Desc",...,...,3]

[3,"Desc",...,...,5]

我正在使用以下列表将其存储在内存中:

List<Object[]> myList = queryLaunched(...);

稍后,我想用这个ListObject[] 做一些操作:

[[1,"Desc",...,...,1],[1,"Desc",...,...,2],...]

我正在尝试通过以下方式使用 stream.map:

myList.stream().map(item -> System.out.println(item.toString()));

但我刚刚收到此错误:

类型不匹配:无法从 Stream&lt;Object&gt; 转换为 void

无论我在 google 哪里看,我都会找到用 List&lt;Class&gt; 制作的样本,而不是用 List&lt;Object[]&gt; 制作的样本。

我怎样才能打印,因此,在它之后,开始对该列表中的每个项目进行操作?

【问题讨论】:

  • 对不起,汤姆,我同意你的看法。当我发布问题时,我确定我必须使用地图,而 Eran 让我明白为什么我不应该这样做。但现在我看到在我试图做的那个问题中得到了正确的回答。谢谢

标签: java arrays list java-8 java-stream


【解决方案1】:

map 用于将Stream&lt;TypeA&gt; 转换为Stream&lt;TypeB&gt;。为了打印元素,不要使用map

你可以使用终端操作:

myList.stream().forEach(item -> System.out.println(Arrays.toString(item)));

或中间操作(后面可以进行其他操作):

myList.stream().peek(item -> System.out.println(Arrays.toString(item)))... ;

由于您的元素是数组,您应该使用System.out.println(Arrays.toString(item)) 打印它们。

【讨论】:

  • 或者没有 lambda:myList.stream().map(Arrays::toString).forEach(System.out::println);
  • 嗯,答案看起来很酷。不过,我一定遗漏了一些东西:当我将您的选项与 forEach 一起使用时,它会完美地打印数组中的所有元素。但是,如果我用“forEach”代替“peek”,它似乎什么也没做。我需要做任何额外的事情吗?
  • @Mayday peek是中间操作,所以只有在后面有一些终端操作(如collectreduceforEach等)才会执行。 .)。除此之外,它可能不会对流的所有元素执行(它只会对执行终端操作所需的元素执行)。
  • 好的,这就解释了。抱歉,我仍在尝试在 Java SE 8 上学习这些新概念。非常感谢您的回答,真的很有帮助:)
猜你喜欢
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2020-05-06
  • 2013-08-29
  • 2010-10-10
  • 2020-03-07
  • 2020-02-11
  • 1970-01-01
相关资源
最近更新 更多