Tag: collectors

Java 8中throwMerger的替代方案

我正在实现使用合并function的自己的收集器。 不幸的是,对于我的一些情况,我不能重用抛出IllegalStateException的以下JDK合并函数。 java.util.stream.Collectors#throwingMerger 它发生的原因是它具有私有访问修饰符,并且来自其他(非内部)类的访问受到限制。 但是,javadoc说: 这可用于强制假设所收集的元素是不同的 但是,正如我所见,java doc已经过时了。 它不能使用。 问题是JDK是否为java开发人员提供了类似function的访问权限(类似方法,常量等),还是应该自己编写?

java 8 Collector 不是一个function界面,谁可以告诉为什么?

以下代码: public class Test { public static void main(String[] args) { Stream.of(1,2,3).map(String::valueOf).collect(Collectors::toList) } } intellij告诉我: Collector不是function接口 但是当我修改代码如下,一切都很好,我不知道为什么? public class Test { public static void main(String[] args) { Stream.of(1,2,3).map(String::valueOf).collect(Collectors.toList) } }

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 + “‘”) […]

Collectors.groupingBy不接受null键

在Java 8中,这适用于: Stream stream = Stream.of(ArrayList.class); HashMap<Class, List> map = (HashMap)stream.collect(Collectors.groupingBy(Class::getSuperclass)); 但这不是: Stream stream = Stream.of(List.class); HashMap<Class, List> map = (HashMap)stream.collect(Collectors.groupingBy(Class::getSuperclass)); Maps允许使用null键,List.class.getSuperclass()返回null。 但Collectors.grouping可以在Collectors.java第907行发布NPE: K key = Objects.requireNonNull(classifier.apply(t), “element cannot be mapped to a null key”); 如果我创建自己的收集器,它的工作原理改为: K key = classifier.apply(t); 我的问题是: 1)Collectors的Javadoc.groupingBy并没有说它不应该映射一个空键。 出于某种原因这种行为是否必要? 2)是否有另一种更简单的方法来接受一个空键,而不必创建我自己的收集器?

组,收集器,映射(Int到String),映射(映射到对象)

这是我之前在Group上的问题的延续,Sum byType然后使用Java流获得差异 。 正如所建议的那样,我应该发布一个单独的线程而不是更新原始线程。 因此,在我之前的一系列问题中,我已经实现了这一点,现在,继续进行。 背景: 我有以下数据集 Sample(SampleId=1, SampleTypeId=1, SampleQuantity=5, SampleType=ADD), Sample(SampleId=2, SampleTypeId=1, SampleQuantity=15, SampleType=ADD), Sample(SampleId=3, SampleTypeId=1, SampleQuantity=25, SampleType=ADD), Sample(SampleId=4, SampleTypeId=1, SampleQuantity=5, SampleType=SUBTRACT), Sample(SampleId=5, SampleTypeId=1, SampleQuantity=25, SampleType=SUBTRACT) Sample(SampleId=6, SampleTypeId=2, SampleQuantity=10, SampleType=ADD), Sample(SampleId=7, SampleTypeId=2, SampleQuantity=20, SampleType=ADD), Sample(SampleId=8, SampleTypeId=2, SampleQuantity=30, SampleType=ADD), Sample(SampleId=9, SampleTypeId=2, SampleQuantity=15, SampleType=SUBTRACT), Sample(SampleId=10, SampleTypeId=2, SampleQuantity=35, SampleType=SUBTRACT) 我目前正在使用这个: sampleList.stream() .collect(Collectors.groupingBy(Sample::getTypeId, Collectors.summingInt( sample -> SampleType.ADD.equalsIgnoreCase(sample.getSampleType()) ? […]

Group,Sum byType然后使用Java流获得diff

我想使用流来分组,按类型获取总和,然后按类型查找不同的结果。 所以这是我的数据集。 Sample(SampleId=1, SampleTypeId=1, SampleQuantity=5, SampleType=ADD), Sample(SampleId=2, SampleTypeId=1, SampleQuantity=15, SampleType=ADD), Sample(SampleId=3, SampleTypeId=1, SampleQuantity=25, SampleType=ADD), Sample(SampleId=4, SampleTypeId=1, SampleQuantity=5, SampleType=SUBTRACT), Sample(SampleId=5, SampleTypeId=1, SampleQuantity=25, SampleType=SUBTRACT) Sample(SampleId=6, SampleTypeId=2, SampleQuantity=10, SampleType=ADD), Sample(SampleId=7, SampleTypeId=2, SampleQuantity=20, SampleType=ADD), Sample(SampleId=8, SampleTypeId=2, SampleQuantity=30, SampleType=ADD), Sample(SampleId=9, SampleTypeId=2, SampleQuantity=15, SampleType=SUBTRACT), Sample(SampleId=10, SampleTypeId=2, SampleQuantity=35, SampleType=SUBTRACT) 我目前的做法是这样的: Map result = sampleList.stream() .collect( Collectors.groupingBy( Sample::getSampleTypeId, Collectors.summingInt(Sample::getSampleQuantity) ) ); 我的结果是这样的(SampleTypeId,result): {1=75, […]

Java 8 stream.collect(… groupingBy(… mapping(… reduction)))减少BinaryOperator的使用

我使用groupingBy , mapping和reducing解决了以下问题的解决方案: 在Java 8中优雅地创建带有对象字段的映射作为对象流的键/值 。 总结的目标是获得一张以年龄为关键的地图和一个人作为一套的爱好。 我提出的解决方案之一(不好,但这不是重点)有一个奇怪的行为。 使用以下列表作为输入: List personList = Arrays.asList( new Person(/* name */ “A”, /* age */ 23, /* hobbies */ asList(“a”)), new Person(“BC”, 24, asList(“b”, “c”)), new Person(“D”, 23, asList(“d”)), new Person(“E”, 23, asList(“e”)) ); 以及以下解决方案: Collector<List, ?, Set> listToSetReducer = Collectors.reducing(new HashSet(), HashSet::new, (strings, strings2) -> { strings.addAll(strings2); return […]

Java 8 Collector UNORDERED特性是什么意思?

在官方文档中,您可以阅读: UNORDERED指示集合操作不承诺保留输入元素的遭遇顺序。 没有任何例子,这没有太大帮助。 我的问题是, UNORDERED特征到底意味着什么? 我应该使用减少收集器,如min或sum,还是只适用于收集器? 在OpenJDK看起来像减少操作(min,sum,avg)具有空特征。 我期望在那里找到至少CONCURRENT和UNORDERED 。

累积Java流,然后才对其进行处理

我有一个类似于以下内容的文档: data.txt中 100, “some text” 101, “more text” 102, “even more text” 我使用正则表达式处理它并返回一个新的处理文档如下: Stream lines = Files.lines(Paths.get(data.txt); Pattern regex = Pattern.compile(“([\\d{1,3}]),(.*)”); List result = lines.map(regex::matcher) .filter(Matcher::find) .map(m -> new MyClass(m.group(1), m.group(2)) //MyClass(int id, String text) .collect(Collectors.toList()); 这将返回已处理的MyClass列表。 可以并行运行,一切正常。 问题是我现在有这个: data2.txt 101, “some text the text continues in the next line and maybe in the next” […]

计算流的元素

我想计算一个流的不同元素,我想知道为什么 Stream stream = Stream.of(“a”, “b”, “a”, “c”, “c”, “a”, “a”, “d”); Map counter1 = stream.collect(Collectors.toMap(s -> s, 1, Integer::sum)); 不起作用。 Eclipse告诉我 收集器类型中的Map(Function,Function,BinaryOperator)方法不适用于参数((s) – > {},int,Integer :: sum) 顺便说一下,我知道这个解决方案: Map counter2 = stream.collect(Collectors.groupingBy(s -> s, Collectors.counting())); 所以我有两个问题: 我的第一种方法有什么错误? 你会如何实施这样的计数器? 编辑:我自己解决了第一个问题: Map counter1 = stream.collect(Collectors.toMap(s -> s, s -> 1, Integer::sum)); Java期望一个函数作为第二个参数。