Tag: java stream

如何使用流过滤并将2D IntArray映射到Set

我有一个二维的IntArray代表一个游戏板,其中-1代表一个空格,一些值大于或等于0意味着该单元属于某个玩家。 像下面的东西(-1表示点(。)) . . . . . 1 0 . . 2 0 . 1 3 3 4 3 . . 0 我想要得到一个已经被任何玩家占用的单元格的位置。 像这样的东西: [Cell{1,0}, Cell{1,1}, …, Cell{3,4}] 我知道第一种方法是迭代2D数组: val set = HashSet(); for(row in 0 until HEIGHT){ for (col in 0 until WIDTH){ if(board[row][col] >= 0) set.add(Cell(row, col)) } } 但是…如果我使用流,它会更有效吗? 是否可以用更少的代码和更有效的方式来实现? IntStream.range(0, HEIGHT) […]

什么Java 8 Stream.collect等价物在标准Kotlin库中可用?

在Java 8中,有Stream.collect ,它允许在集合上进行聚合。 在Kotlin中,这不是以同样的方式存在,除了可能作为stdlib中扩展函数的集合。 但是不清楚不同用例的等价关系是什么。 例如, JavaDoc for Collectors的顶部是为Java 8编写的示例,将它们移植到Kolin时,不能在不同的JDK版本上使用Java 8类,因此可能应该使用不同的方式编写。 就在线资源展示Kotlin集合的例子而言,它们通常是微不足道的,并没有真正与相同的用例相比较。 什么是真正符合Java 8 Stream.collect记录的案例的好例子? 这里的列表是: 将名字积累到列表中 将名称累加到TreeSet中 将元素转换为字符串并连接它们,用逗号分隔 计算员工的工资总额 按部门分组员工 按部门计算工资总额 将学生划分为通过和失败 上面链接了JavaDoc中的细节。 注意: 这个问题是由作者故意写的和回答的( 自我回答的问题 ),所以对于常见的Kotlin话题的习惯性的回答是在SO中。 此外,为了澄清一些真正的古老的答案写为科特林的阿尔法,是不是今天的Kotlin准确。

是否有任何相当于Java 8 Stream限制function的Kotlin函数?

我试图find符合条件(过滤)的列表中的前两个元素,为此,我已经在kotlin中实现了以下代码片段: val arr = 0 until 20 val res = arr.filter { i -> println(“Filter: $i”) i % 2 == 0 }.take(2) 一切都很好,直到我意识到它通过整个清单过滤,无论是否find了这两个元素。 利用Java 8流API,它按预期工作。 val res2 = arr.toList().stream() .filter { i -> println(“Filter: $i”) i % 2 == 0 }.limit(2) 所以我的问题是,如果只能使用Kotlin函数来实现。 我知道我可以使用一个简单的循环,但我想使用一个函数式编程aproach。

Java将特定类的列表添加到java.lang.Object列表中,与java 8 streams一起工作 – 为什么?

public class Test { static List<Object> listA = new ArrayList<>(); public static void main(final String[] args) { final List<TestClass> listB = new ArrayList<>(); listB.add(new TestClass()); // not working setListA(listB); // working setListA(listB.stream().collect(Collectors.toList())); System.out.println(); } private static void setListA(final List<Object> list) { listA = list; } } 为什么它与流一起工作,并不适用于简单的设置?

如何使用Java 7或更早版本实现Java 8 Stream API?

我在面试中被问及这个问题(微软)。 实施方法举例如下: (),.filter(),.map(),flatMap(),min(),count(),reduce(),groupBy() 等等 这是一个相当开放的问题,但我认为是一个有趣的问题。 谢谢

为什么Stream.flatMap不能接受集合?

给出以下作为数据类的例子: class Country { List<Region> regions = new ArrayList<>(); List<Region> getRegions() { return regions; } } class Region { String getName() { return "some name"; } } 假设我会有一个国家名单 List<Country> countries = new ArrayList<>(); 我想把这些流到他们的地区和他们相应的名字,我想做以下事情: countries.stream().flatMap(Country::getRegions).map(Region::getName)… 但是,由于“getRegions”的返回值是Collection(List),而不是由FlatMap方法接受的Stream,所以该代码不能编译。 但是因为我知道任何Collection都可以通过它的Collection.stream()方法进行流式处理,这应该不是问题。 我仍然被迫写下如下: countries.stream().flatMap(c -> c.getRegions().stream()).map(Region::getName)… 哪个(给予更丰富的上下文)比前者更不可读。 问题是,有什么原因,我错过了,因为这是庞大的? 在我的框架中,我有很多的例子,我不得不采取这种方式,总是让我酸酸的味道。 (猜猜我只需要将Kotlin添加到我们的项目中,并使用带有Collection:p或do的flatMap方法来扩展Stream类)

Java 8中的map和flatMap方法有什么区别?

在Java 8中, Stream.map和Stream.flatMap方法有什么区别?

Java将列表转换为集合的映射

假设我有一个名为Student的对象列表。 对象学生是这样定义的 public Class Student { private String studentName; private String courseTaking; } 在学生名单中,可以有多个具有相同studentName但不同courseTaking的学生对象。 现在我想把学生名单变成一个studentName和course的地图像这样 Map<String, Set<String>> 关键是studentName,价值就是把同一个学生的所有课程作为一个整体放在一起。 我怎样才能使用stream()和collect()?

如何在Kotlin的Java 8 Stream上调用collect(Collectors.toList())?

我有一些代码: directoryChooser.title = "Select the directory" val file = directoryChooser.showDialog(null) if (file != null) { var files = Files.list(file.toPath()) .filter { f -> f.fileName.endsWith("zip") && f.fileName.endsWith("ZIP") && (f.fileName.startsWith("1207") || f.fileName.startsWith("4407") || f.fileName.startsWith("1507") || f.fileName.startsWith("9007") || f.fileName.startsWith("1807")) } for (f in files) { textArea.appendText(f.toString() + "\n") } } 如果我在过滤器的末尾调用collect(Collectors.toList()) ,我会得到: Error:(22, 13) Kotlin: [Internal Error] org.jetbrains.kotlin.codegen.CompilationException: […]

使用Kotlin中的Java Stream API获取列表中的元素

以下代码(用Kotlin编写)从列表中提取元素。 它工作,但看起来相当丑陋,难以阅读。 有没有更好的方法来写入与Java流API相同? (例子可以在Kotlin或Java中给出) val listOfLists: List<Any> = … val outList: MutableList<Any> = mutableListOf() listOfLists.forEach { list -> if (list is ArrayList<*>) list.forEach { l -> outList.add(l) } } return outList;