我有一张班友名单
class foo(){
private String location;
private int total;
//constructor, getters, and setters
}
我想分组名单的foo根据他们的位置和总和,我如何实现它与Java流?
expected output
[
{
"location" = "locationA",
"total" = 123
},
{
"location" = "locationB",
"total" = 167
}
]
我所取得的成就:
{locationA=123, locationB=167}
我的代码:
static Function<List<Case>, Object> totalPerYear = cases -> cases.stream()
.collect(Collectors.groupingBy((Case c)->c.getYear(),
Collectors.summingInt((Case c)->c.getNumber())));
我假设您希望将案例列表映射到Foos列表:
class Main {
private static List<Integer> costsList;
public static void main(String args[]) throws Exception {
List<Case> list = new ArrayList<>();
list.add(new Case("2020", 4));
list.add(new Case("2021", 2));
list.add(new Case("2020", 2));
list.add(new Case("2022", 3));
List<Foo> foos = totalPerYear.apply(list);
foos.forEach(System.out::println);
}
static Function<List<Case>, List<Foo>> totalPerYear = cases -> cases.stream()
.collect(Collectors.groupingBy(Case::getYear, Collectors.summingInt(Case::getNumber)))
.entrySet()
.stream()
.map(entry -> new Foo(entry.getKey(), entry.getValue()))
.collect(Collectors.toList());
static class Foo {
private String year;
private int total;
public Foo(String year, int total) {
this.year = year;
this.total = total;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
@Override
public String toString() {
return "Foo{" +
"year='" + year + '\'' +
", total=" + total +
'}';
}
}
static class Case {
private String year;
private int number;
public Case(String year, int number) {
this.year = year;
this.number = number;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
}
输出:
Foo{year='2022', total=3}
Foo{year='2021', total=2}
Foo{year='2020', total=6}
如果我正确理解了您的要求,您希望为每个location
找到属性值的总和total
。如果是,您可以按照以下方式进行:
Map<String, Integer> map =
list.stream()
.collect(Collectors.groupingBy(Foo::getLocation, Collectors.summingInt(Foo::getTotal)));
演示:
public class Main {
public static void main(String[] args) {
List<Foo> list = List.of(new Foo("x", 10), new Foo("y", 5), new Foo("x", 15), new Foo("y", 10),
new Foo("z", 10), new Foo("a", 10));
Map<String, Integer> map =
list.stream()
.collect(Collectors.groupingBy(Foo::getLocation, Collectors.summingInt(Foo::getTotal)));
System.out.println(map);
}
}
输出:
{a=10, x=25, y=15, z=10}
我想知道我是否能做这样的事情。假设我有一个数字流1-20。我想利用一个特性,比如drop 3(我想用Java术语来说是限制还是跳过?)并产生一个流,即数字流: 1-20、4-20、7-20等 然后可能平坦地将这些全部映射到一条溪流中。我尝试了使用Stream.iterate的各种组合,主要是从流生成流,但我一直收到一个IllegalStateExcema,说流已经操作或关闭。 例如,人们可能期望这
我写了一个kafka流代码,使用kafka 2.4 kafka客户端版本和kafka 2.2服务器版本。我的主题有50个分区 我的Kafka流代码有选择键()DSL操作,我有200万条记录使用相同的KEY。在流配置中,我已经完成了 因此,我能够使用完全相同的键使用不同的分区。如果我没有按预期使用轮循机制,我的所有消息都会转到同一分区。 直到现在一切都很好,但我意识到;当我使用RoundRobin分
我有一个通用的Streams API问题,我想“高效地”解决。假设我有一个(可能非常大,可能无限)流。我想以某种方式对其进行预处理,例如,过滤掉一些项目,并对一些项目进行变异。让我们假设这个预处理是复杂的,时间和计算密集型的,所以我不想做两次。 接下来,我想对项序列执行两组不同的操作,并使用不同的流类型构造处理每个不同序列的远端。对于无限流,这将是一个forEach,对于有限流,它可能是一个收集器
我对流媒体有一个普遍的问题,但对于问题的范围,让我们限制自己使用Kafka Streams。让我们进一步缩小范围,将我们的问题局限于单词计数,或者可能是一般的计数。假设我有一个由某个键和一个值组成的流,键可以是一个字符串(假设我们可以有很多字符串,除了空字符串,由世界上的任何字符组成),值是一个整数,现在我们正在构建一个单词计数应用程序,如果词汇表中的单词总数是一万亿,我们不能将它们存储在本地缓存
在Spring Boot应用程序中,我试图配置Kafka流。用简单的Kafka主题,一切都很好,但我无法得到工作SpringKafka流。 这是我的配置: 我想创建一个基于主题的流。应用一个简单的转换并将此流中的消息发送到test主题。 我向发送以下消息,其中是我自己的复杂类型,但是我现在不知道如何将它转换为中的,以便能够在中使用它。 请建议如何使其工作。
我是Java 8的新手。我仍然不了解这个API,但是我做了一个小型的非正式基准测试来比较新的Streams API与好的旧集合的性能。 测试包括筛选一个列表,并对每个偶数计算平方根,并将其存储在的结果中。 代码如下: 问题: 这个测试公平吗?我犯错了吗? 流比集合慢吗?有没有人在这方面做了一个很好的正式基准? 我应该争取哪种方法? 更新结果。 按照@pveentjer的建议,我在JVM预热(1k次