Tag: java stream

如何使用Java 8从对象列表中获取最小值和最大值

我喜欢上课: public class Test { private String Fname; private String Lname; private String Age; // getters, setters, constructor, toString, equals, hashCode, and so on } 和List testList这样的List testList填充了Test元素。 如何使用Java 8获得最小和最大age值?

是否有可能在Java 8中创建由递归定义的惰性(更好的无限)集合?

我可以创建一个递归闭包: static IntUnaryOperator fibo; fibo = (i) -> i<2 ? 1 : fibo.applyAsInt(i-1)+ fibo.applyAsInt(i-2); 但当然,它只是作为一个例子。 相反,如果我创建了一个惰性/无限列表/流,则可以以非常好的方式使用递归:不必多次计算任何成员。 我想到了以下结构: IntStream fi; fi=IntStream.iterate(0, i -> fi[i-1]+fi[i-2]); 但是那样它就行不通了 – 我无法通过索引从流中获取一个项目。另一个问题是,如果我以后再沿着流,它将被消耗,我不能重复使用它。 如果我将流复制到List,它就不再是懒惰了。 因此,我需要一些我可以通过索引解决的构造。 作为fibo(i) 。 编辑。 显然,解决方案不能是流,因为流不能使用两次。 我不想在每次调用F(i)时重复所有计算。

如何使用java8流对TreeSet的列表进行排序

我的列表包含[1,3,5][2,6,4]等集合,大小相同。 我试过这样做,但似乎没有用。 List<TreeSet> block; for(TreeSet t : block){ block.stream().sorted((n,m)->n.compareTo(m)).collect(Collectors.toSet()); } 我想要的最终结果是[1,2,3][4,5,6] 。 我可以尝试在ArrayList添加所有元素并对其进行排序,然后创建一个新的TreeSet List 。 但是有一种衬垫吗? 更新: List list=new ArrayList(); for(TreeSet t : block){ for(T t1 : t) { list.add(t1); } } list=list.stream().sorted((n,m)->n.compareTo(m)).collect(Collectors.toList()); 这有效但可以简化吗?

Stream.max(Integer :: max):意外结果

我正在学习1z0-809:Java SE 8程序员II使用Enthuware的模拟测试。 遇到这个问题。 List ls = Arrays.asList(3,4,6,9,2,5,7); System.out.println(ls.stream().reduce(Integer.MIN_VALUE, (a, b)->a>b?a:b)); //1 System.out.println(ls.stream().max(Integer::max).get()); //2 System.out.println(ls.stream().max(Integer::compare).get()); //3 System.out.println(ls.stream().max((a, b)->a>b?a:b)); //4 以上哪个陈述将打印9? 答案是 1和3 但还有别的东西。 我不明白为什么 System.out.println(ls.stream().max(Integer::max).get()); // PRINTS 3 我尝试使用peek调试它,但它无法帮助我理解。 我尝试使用Integer::max和Integer::compare对ls进行排序 ls.sort(Integer::max); // [3, 4, 6, 9, 2, 5, 7] ls.sort(Integer::compare); // [2, 3, 4, 5, 6, 7, 9] 当然,我得到的事实是Integer::max不是比较器,因此它具有相同的签名。 对我来说, max在第一种情况下应该是7 ,因为它是最后一个元素,就像我用Ìnteger::compare排序一样 有人可以把它分解成简单的东西吗?

stream和parallelStream

我有一个这样的测试代码: List list = new ArrayList(1000000); for(int i=0;i<1000000;i++){ list.add(i); } List values = new ArrayList(1000000); list.stream().forEach( i->values.add(new Date().toString()) ); System.out.println(values.size()); 运行这个,我得到了正确的输出:1000000。 但是,如果我将stream()更改为parallelStream() ,如下所示: list.parallelStream().forEach( i->values.add(new Date().toString()) ); 我有一个随机输出,例如:920821。 怎么了?

如何将字符串流转换为字符串流对?

我想取一串字符串并将其转换为单词对流。 例如: 我有: { “A”, “Apple”, “B”, “Banana”, “C”, “Carrot” } 我想要: { (“A”, “Apple”), (“Apple”, “B”), (“B”, “Banana”), (“Banana”, “C”) } 。 这与使用带有lambda的JDK8的Zipping流中概述的Zipping几乎相同(java.util.stream.Streams.zip) 然而,这会产生: { (A, Apple), (B, Banana), (C, Carrot) } 以下代码有效,但显然是错误的方法(不是线程安全等): static String buffered = null; static void output(String s) { String result = null; if (buffered != null) { result = […]

如何在java 8中迭代JSONArray

我有以下代码,它使用for loop迭代JSONArray的元素。 import org.apache.log4j.Logger; import org.json.JSONArray; import org.json.JSONObject; import java.util.stream.IntStream; public class Pmt { private String[] patchInformation_svnRevisionpublic; private final Logger logger = Logger.getLogger(Pmt.class.getName()); private static final String COMMITS_IN_PATCH_IDENTIFIER = “patchInformation_svnRevisionpublic”; //key used to identify the commits in a patch from JSON response received from PMT private static final String KEY_STRING = “name”; private static final […]

使用Java8 Stream从map中查找最高值

我编写了以下方法来查找映射到最高值的键并尝试转换为java Stream 。 你能帮忙吗? private List testStreamMap(Map mapGroup) { List listMax = new ArrayList(); Long frequency = 0L; for (Integer key : mapGroup.keySet()) { Long occurrence = mapGroup.get(key); if (occurrence > frequency) { listMax.clear(); listMax.add(key); frequency = occurrence; } else if (occurrence == frequency) { listMax.add(key); } } return listMax; }

用java 8计算字数

我试图在java 8中实现一个字数统计程序,但我无法使它工作。 该方法必须将字符串作为参数并返回Map 。 当我以旧java方式进行时,everthing工作正常。 但是当我尝试在java 8中执行它时,它返回一个映射,其中键是空的,具有正确的出现次数。 这是我的java 8风格的代码: public Map countJava8(String input){ return Pattern.compile(“(\\w+)”).splitAsStream(input).collect(Collectors.groupingBy(e -> e.toLowerCase(), Collectors.reducing(0, e -> 1, Integer::sum))); } 这是我在正常情况下使用的代码: public Map count(String input){ Map wordcount = new HashMap(); Pattern compile = Pattern.compile(“(\\w+)”); Matcher matcher = compile.matcher(input); while(matcher.find()){ String word = matcher.group().toLowerCase(); if(wordcount.containsKey(word)){ Integer count = wordcount.get(word); wordcount.put(word, ++count); } else […]

Java Streams | groupingBy相同的元素

我有一个单词流,我想根据相同元素(=单词)的出现对它们进行排序。 例如:{hello,world,hello} 至 Map<String, List> 你好你好你好} 世界,{世界} 到目前为止我有什么: Map<Object, List> list = streamofWords.collect(Collectors.groupingBy(???)); 问题1:流似乎丢失了他正在处理字符串的信息,因此编译器强制我将类型更改为Object,List 问题2:我不知道在胃肠道内放入什么,以同样的方式将其分组。 我知道我能够处理lambda表达式中的单个元素,但我不知道如何到达每个元素的“外部”以检查是否相等。 谢谢