Tag: java stream

用Java初始化带有流的2d数组

我有以下课程: public class MyClass{ //… public MyClass(int x, int y){ //… } } 现在,我需要使用项目初始化2d-array int rows; int cols; //initializing rows and cols MyClass[][] arr = new MyClass[rows][cols]; //how to initialize arr[x][y] with //new MyClass(x, y) with streams API 我看了一下这个例子,但它在我的情况下不起作用。 他们使用单个IntStream 问题:当然我可以使用嵌套的for循环,但我认为它现在是旧式的并且考虑不好。 那么如何应用流api并以Java8方式Java8它?

为什么不排序(Comparator :: reverseOrder)有效?

以下Stream表达式完美无缺: Stream s = Stream.of(“yellow”,”blue”, “white”); s.sorted(Comparator.reverseOrder()) .forEach(System.out::print);` //yellowwhiteblue 为什么没有与方法引用相同的编译? s.sorted(Comparator::reverseOrder).forEach(System.out::print); Comparator类型不定义此处适用的reverseOrder(String,String)

Java流API将lambda表达式存储为变量

这个标题对我来说听起来很愚蠢,但必须至少有一些聪明的方法才能达到这样的效果,我不知道如何解释它。 我需要使用sorted in stream API对数组进行排序。 到目前为止,这是我的流: Arrays.stream(sequence.split(” “)) .mapToInt(Integer::parseInt) .boxed() .sorted((a, b) -> a.compareTo(b)) .forEach(a -> System.out.print(a + ” “)); 现在我有两种不同的过程 – 升序和降序,我需要使用的排序在用户输入中指定。 所以我想要做的就是切换2个案例:“升序”和“降序”以及分别存储lambda表达式的变量: switch(command) { case “ascending”: var = a.compareTo(b); case “descending”: var = b.compareTo(a); } 然后我的排序看起来像: .sorted((a, b) -> var) 我在参加的python课程中得到了这个想法。 在那里可以将对象存储在变量中,从而使变量“可执行”。 我意识到这个lambda不是一个对象,而是一个表达式,但我要问的是有什么聪明的方法可以达到这样的结果,或者我应该只有 if(var) 和每个排序顺序的两个不同的流。

如何使用流API在Java 8中映射?

好的,所以我有一个List 。 每个Person都有一个List ,它是该人拥有的电话号码列表。 所以这是基本结构: public class Person { private String name; private List phoneNumbers; // constructors and accessor methods } 我想创建一个Map ,其中key是该人拥有的每个电话号码,值是实际的人。 所以要更好地解释。 如果我有这个List : Person bob = new Person(“Bob”); bob.getPhoneNumbers().add(“555-1738”); bob.getPhoneNumbers().add(“555-1218”); Person john = new Person(“John”); john.getPhoneNumbers().add(“518-3718”); john.getPhoneNumbers().add(“518-3115”); john.getPhoneNumbers().add(“519-1987”); List list = new ArrayList(); list.add(bob); list.add(john); 我调用了这个方法。 它会给我以下Map Map map = new HashMap(); […]

Java 8流:条件收集器

我想使用Java 8流将List of String值转换为单个String。 像“A”,“B”这样的值列表应返回一个字符串,如“值:’A’,’B’已添加”。 这工作正常,但我想根据值的数量更改前缀和后缀。 例如,如果我有一个只有“A”的列表,我希望生成的字符串为“值’A’添加”。 import java.util.stream.Collectors; import java.util.ArrayList; import java.util.List; public class HelloWorld { public static void main(String[] args) { List values = new ArrayList(); values.add(“A”); values.add(“B”); values.add(“C”); List value = new ArrayList(); value.add(“A”); System.out.println(log(values)); System.out.println(log(value)); } public static String log(List values){ return values.stream() //.filter(…) .map(x -> “‘” + x + “‘”) […]

连接List中所有Maps的String值

我正在尝试调整Lambdafunction,但是在这里和那里很少有挣扎。 List<Map> list = new LinkedList(); Map map = new HashMap(); map.put(“data1”, “12345”); map.put(“data2”, “45678”); list.add(map); 我只想以逗号分隔格式打印值,如12345,45678 所以这是我的审判 list.stream().map(Map::values).collect(Collectors.toList()) //Collectors.joining(“,”) 输出为[[12345,45678]] 。 这意味着,有一个列表和内部列表,它在0索引处创建逗号分隔值。 我明白为什么会这样做。 但是我没有通过如何提取我想要的结果,除非我在该表达式的末尾调用.get(0) 。 任何有关如何更好地使用lambdas的帮助/更多见解将会有所帮助

以并行方式将`BufferedReader`转换为`Stream `

有没有办法从BufferedReader reader接收Stream stream ,这样stream中的每个字符串代表一行reader ,其中附加条件是直接提供stream ( reader读取所有内容之前)? 我想处理stream并行的数据,以便从reader那里获取它们以节省时间。 编辑:我想处理与阅读并行的数据。 我不想并行处理不同的行。 它们应该按顺序处理。 让我们举例说明我希望如何节省时间。 假设我们的reader将向我们展示100行。 读取一行需要2 ms,处理1 ms需要1 ms。 如果我先读取所有行然后处理它们,将需要300毫秒。 我想要做的是:一旦读取一行,我想处理它并且并行读取下一行。 总时间将为201毫秒。 我不喜欢BufferedReader.lines() :据我所知,当我想处理这些行时,读取就开始了。 我们假设我已经有了我的reader但在能够处理第一行之前必须进行预计算。 假设它们花费30毫秒。 在上面的例子中,使用reader.lines()总时间为231毫秒或301毫秒(你能告诉我哪些时间是正确的吗?)。 但是有可能在201毫秒内完成工作,因为预计算可以与读取前15行并行完成。

如何在流中将1个完成的未来分成许多可完成的未来?

例如,我有这样的方法: public CompletableFuture getPage(int i) { … } public CompletableFuture getDocument(int i) { … } public CompletableFuture parseLinks(Document doc) { … } 我的流量: List list = IntStream .range(0, 10) .mapToObj(i -> getPage(i)) // I want method like this: .thenApplyAndSplit(CompletableFuture page -> { List<CompletableFuture> docs = page.getDocsId() .stream() .map(i -> getDocument(i)) .collect(Collectors.toList()); return docs; }) .map(CompletableFuture […]

Java 8中记忆的无限Fibonacci序列

首先,我是一名JavaScript程序员,对Java8很新,并尝试新的function。 由于我专注于JS编码,我实现了自己的JS懒惰函数库来进行概念validation。 https://github.com/kenokabe/spacetime 使用该库,我可以编写无限序列的自然数和Fibonacci ,如下所示: JavaScript的 var spacetime = require(‘./spacetime’); var _ = spacetime.lazy(); var natural = _(function(n) //memoized automatically { return n; // Natural numbers is defined as the `n`th number becomes `n` }); var natural10 = _(natural) .take(10) .compute(function(x) { console.log(x); }); //wrap a recursive function to memoize // must be at the […]

是否有可能在java 8中执行一个惰性groupby,返回一个流?

我有一些大型的文本文件,我想通过对其行进行分组来处理。 我尝试使用新的流媒体function,比如 return FileUtils.readLines(…) .parallelStream() .map(…) .collect(groupingBy(pair -> pair[0])); 问题是,AFAIK,这会生成一个Map。 有没有办法像上面那样产生高级代码,例如,一个条目流? 更新 :我正在寻找的是像python的itertools.groupby 。 我的文件已经排序(通过pair [0]),我只想逐个加载组。 我已经有了一个迭代解决方案。 我只是想知道是否有更多的声明方式来做到这一点。 顺便说一句,使用番石榴或其他第三方图书馆不会是一个大问题。