与Java中的Ruby#map或#collect等价?

与Java中的Ruby#map或#collect等价?,java,android,Java,Android,假设我有一个数组movies=get\u movies() 在ruby中,我经常这样做 movies.map{| movie | movie.poster_image_url}或类似的东西 在Java中我可以做什么类似的事情?同样优雅、简洁、易读。我知道有无数种方法可以做到这一点,但如果有一种很好的方法可以让我不想使用Groovy或其他东西,请告诉我。我相信Java有一些很棒的方法来做这样的事情 这是到目前为止我使用MoviedBAPI Java包装器编写的Java代码 关于Ruby中的#map

假设我有一个数组
movies=get\u movies()

在ruby中,我经常这样做
movies.map{| movie | movie.poster_image_url}
或类似的东西

在Java中我可以做什么类似的事情?同样优雅、简洁、易读。我知道有无数种方法可以做到这一点,但如果有一种很好的方法可以让我不想使用Groovy或其他东西,请告诉我。我相信Java有一些很棒的方法来做这样的事情

这是到目前为止我使用MoviedBAPI Java包装器编写的Java代码

关于Ruby中的#map/#collect的更多信息,以防您了解很多Java,但不熟悉Ruby

到目前为止,我从一些快速浏览中看到的最接近于回答这个问题的东西

这些看起来也很接近

有这么多选择:

这也是Android。。。Android开发人员有什么好东西可以提供,让这种编程变得简单吗?这是一种函数式编程风格,对吗

--

在收到回复后,我得到了一些非常好的见解,比如:“for循环没有什么问题”和(基本上)“语法不是一切”,我决定我不会让我的Java看起来像Ruby!我读了这篇文章,然后想象了另一个未来,“未来的我”做出了一大堆糟糕的风格决定: 我认为(一个集合类)。foreach()是您想要的,需要java8,并且经常使用lambda表达式来实现满足“foreach()”方法所需输入的类



要解决您对这是Android的更改,那么不,您将不会得到java8类更改,例如.foreach(),您可以通过使用获得lambda表达式。但这只提供了一些Java8的“语法”而不是“类”,您也无法访问Streams类

流上有一个
map
方法,它接受一个方法参数

collection.stream()
  .map(obj -> obj.someMethod())
  .collect(Collectors.toList()));
map
返回另一个流,因此为了检索列表,您需要调用
collect
方法

在帖子中解释太多了,但是你可以访问这个链接,它帮了我很多忙:


听起来不错。是否有类似于forEach的方法返回已处理的集合?希望我的问题有意义。我对Java的了解还不够,可能无法提出一个好问题。但是我喜欢ruby方法#map和#collect的地方在于它们返回处理过的集合。请阅读我在android上针对这个问题的编辑(扰流板:对不起,lol)foreach()使用Iterable/Iterator接口/类,因此它可以就地修改集合,但不返回任何内容。是否有值得我添加到Gradle配置的库?谷歌番石榴是我听说的一种适合fp类型的东西。。。阅读更多关于retrolambda的内容…我不知道,我没有太多使用functional。它很流行,但Java8的实现不允许我在“函数”语言中看到的特性,在这些语言中,直到参数被处理之后,你才知道参数的第二个或第三个参数,等等(我可能对这种解释“有点”不满意,因为我自己从来没有写过)。Java8的“函数式”编程主要是通过
results.getResults().stream().map(MovieResult::getPosterPath).collect(Collectors.toList())等方式查找Java8的Java.util.stream。如果要对.stream()/.collect()进行一长串的摊销操作,或者使用
.parallel()
进行并行处理,则效果最好。但事实上,for循环并没有什么问题……我可以进一步压缩它吗?在ruby中,您可以执行
movies.map{code>movie.link}
movies.map(&:link)
。有类似的东西吗?不幸的是,就这么多了。我之所以能够将lambda表达式压缩到如此低的程度,唯一的原因是因为我只有一个参数和一个语句。否则,它看起来会是这样的:
(obj1,obj2,…objn)->{statements;}
Java8通过允许您传递方法,在某种程度上使方法或函数成为一等公民。如果您发现lambda表达式太冗长,您也可以尝试一下,但是在这一点上它很简单,谢谢。它仍然非常好。您可以将其与
%:link
进行比较,并使用类似
YourObject::someMethod
的函数引用@David:整个stream的功能要比Ruby或Groovy好得多(由于懒惰的评估),专注于语法并不是最重要的。Util.stream只是从Java1.8(Java8)开始的,你在Android上不会得到它(最早要等到下一个google IO,如果他们在Android上添加对Java8的支持的话)
collection.stream()
  .map(obj -> obj.someMethod())
  .collect(Collectors.toList()));