我现在正在学习lambda,我想知道如何用lambda一行编写这段代码.
我有一个Person包括ID和name字段的类
目前,我有一个List<Person>存储这些Person对象.我想要完成的是获取一个由人的id组成的字符串.
"id1,id2,id3".
我怎样才能用lambda实现这个目标?
如果要对流中的整数值求和,有两种主要方法:
ToIntFunction<...> mapFunc = ...
int sum = stream().collect(Collectors.summingInt(mapFunc))
int sum = stream().mapToInt(mapFunc).sum()
Run Code Online (Sandbox Code Playgroud)
第一个涉及装箱返回的整数并将其拆箱,但第二个步骤涉及额外的步骤.
哪个更有效/更清晰?
我有一组从共享类型(即继承域对象的GroupRecord extends Record,RequestRecord extends Record).亚型具有特定属性(即GroupRecord::getCumulativeTime,RequestRecord::getResponseTime).
此外,由于解析日志文件,我有一个混合子类型的记录列表.
List<Record> records = parseLog(...);
Run Code Online (Sandbox Code Playgroud)
为了计算日志记录的统计数据,我想仅在与特定子类型匹配的记录子集上应用数学函数,即仅在GroupRecords上.因此,我希望有一个特定子类型的过滤流.我知道我可以使用一个filter和map一个子类型
records.stream()
.filter(GroupRecord.class::isInstance)
.map(GroupRecord.class::cast)
.collect(...
Run Code Online (Sandbox Code Playgroud)
在流上多次应用此过滤器和强制转换(特别是对于不同的计算多次执行相同的子类型时)不仅繁琐,而且会产生大量重复.
我目前的做法是使用a TypeFilter
class TypeFilter<T>{
private final Class<T> type;
public TypeFilter(final Class<T> type) {
this.type = type;
}
public Stream<T> filter(Stream<?> inStream) {
return inStream.filter(type::isInstance).map(type::cast);
}
}
Run Code Online (Sandbox Code Playgroud)
要应用于流:
TypeFilter<GroupRecord> groupFilter = new TypeFilter(GroupRecord.class);
SomeStatsResult stats1 = groupFilter.filter(records.stream())
.collect(...)
SomeStatsResult stats2 = groupFilter.filter(records.stream())
.collect(...)
Run Code Online (Sandbox Code Playgroud)
它有效,但我发现这种方法对于这么简单的任务来说有点多了.因此我想知道,使用流和函数以简洁和可读的方式使这种行为可重用是否有更好或更好的方法是什么?
我正在学习java Stream,并且很难解决下面的问题.我被卡住的原因是因为我不知道如何处理Stream<Integer>.
我偶然发现了"计数"的解决方案list.stream().count(),但除此之外,我无法继续前进.请帮助我如何处理这些问题并告诉我为什么list.stream().count()在这种情况下工作.到目前为止,我已经尝试了所学到的一切.
public class Question {
public static void main(String[] args) {
List<Integer>list = Arrays.asList(5,3,4,1,2);
System.out.println("sum by using Stream : " + sum);
System.out.println("count by using Stream: " + count);
System.out.println("average by using Stream : " + avg);
System.out.println("sort by using Stream");
}
}
Run Code Online (Sandbox Code Playgroud)