我正在尝试创建一个类似于 的自定义浮动添加Collectors.summingDouble()。
但我面临两个问题,我不知道如何解决它。
BiConsumer- 第 #27 行 - void 方法不能返回值Collectors.ofBiConsumer<R,T>- 第 32 行 - Collector 类型中的 (Supplier, , , Collector.Characteristics...)方法BinaryOperator<R>不适用于参数 ( Supplier<Float[]>, BiConsumer<Float,Employee>, BinaryOperator<Float>) 这里需要做什么来解决这个问题?public class CustomCollector {
public static void main(String[] args) {
Employee e1=new Employee(1,"Tom",10.2f);
Employee e2=new Employee(1,"Jack",10.4f);
Employee e3=new Employee(1,"Harry",10.4f);
ArrayList<Employee> lstEmployee=new ArrayList<Employee>();
lstEmployee.add(e1);lstEmployee.add(e2);lstEmployee.add(e3);
/* Implementation 1
* double totalSal=lstEmployee.stream().collect(Collectors.summingDouble(e->e.getSal()));
System.out.println(totalSal);
*/
//Implementation 2
Function<Employee,Float> fun=(e)->e.getSal();
BiConsumer<Float,Employee> consumer=(val,e)->val+e.getSal();
BinaryOperator<Float> operator=(val1,val2)->val1+val2;
Supplier<Float[]> supplier=() -> new Float[2]; …Run Code Online (Sandbox Code Playgroud) 我有一个如下所示的对象:
public class Resource {
int level;
String identifier;
boolean isEducational;
public Resource(String level, String identifier, boolean isEducational) {
this.level = level;
this.identifier = identifier;
this.isEducational = isEducational;
}
// getter and setters
}
Run Code Online (Sandbox Code Playgroud)
这些资源的列表如下:
List<Resource> resources = Arrays.asList(new Resource(4, "a", true ),
new Resource(4, "b", false),
new Resource(3, "c", true ),
new Resource(3, "d", false ),
new Resource(2, "e", true ),
new Resource(2, "f" , false));
Run Code Online (Sandbox Code Playgroud)
我想按其属性对这个列表进行排序,但是这种排序应该针对资源和非资源level分别进行。isEducationalisEducational
因此,排序后,结果列表应按以下顺序排列:
[Resource e, Resource c, Resource …Run Code Online (Sandbox Code Playgroud) 我有一个与此堆栈溢出问题类似的用例,并尝试使用它而不将结果存储在 a 中List<List<String>>,而是调用stream()它。
List<List<String>>如果由于类型不匹配而没有将其分配给我,则会出现奇怪的编译时错误。要重现该问题,只需注释掉输出的分配即可。
问题是为什么会出现这个编译错误呢?以及如何修复它?
public static void main(String args[]) {
List<String> input = Arrays.asList("RED", "RED", "BLUE", "BLUE", "BLUE", "BLUE", "RED", "RED");
List<List<String>> output = // if this line commented it doesn't compile
input.stream()
.collect(Collector.of(
ArrayList::new,
(accumulator, item) -> {
if (accumulator.isEmpty()) {
List<String> list = new ArrayList<>();
list.add(item);
accumulator.add(list);
} else {
List<String> last = accumulator.get(accumulator.size() - 1);
if (last.isEmpty() || last.get(0).equals(item)) {
last.add(item);
} else {
List<String> list = new ArrayList<>();
list.add(item); …Run Code Online (Sandbox Code Playgroud) toList() 的实现明确返回一个 ArrayList,它确实保证了可变性:
public static <T>
Collector<T, ?, List<T>> toList() {
return new CollectorImpl<>(ArrayList::new, List::add,
(left, right) -> { left.addAll(right); return left; },
CH_ID);
}
Run Code Online (Sandbox Code Playgroud)
但是 toList 的 JavaDoc 是这样的:
/**
* Returns a {@code Collector} that accumulates the input elements into a
* new {@code List}. There are no guarantees on the type, mutability,
* serializability, or thread-safety of the {@code List} returned; if more
* control over the returned {@code List} is required, use {@link #toCollection(Supplier)}.
*
* …Run Code Online (Sandbox Code Playgroud) 我想把我Map <K,V>变成一个Set <V>.我在任何地方都找不到任何示例,包括Oracle的文档:https:
//docs.oracle.com/javase/tutorial/collections/streams/reduction.html
我所能做的更多就是:
myMap.entrySet().parallelStream().
filter((entry) -> entry.getKey().startsWith("a"))
.collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)
这将返回一组Map.Entry.在这个例子中它是Map<String, String>这样我只希望它返回值bit(String),我已经尝试过.collect(Collectors.toSet(HashMap::getValue))但是没有用.那我在这里错过了什么?
执行下面的代码时出错,
引起:java.lang.IllegalAccessError:试图从类访问com.google.common.collect.AbstractTable类
ImmutableTable.copyOf(listItemsToProcess.parallelStream()
.map(item ->
ProcessorInstanceProvider.getInstance()
.buildImmutableTable(item))
.collect(() -> HashBasedTable.create(),
HashBasedTable::putAll,
HashBasedTable<Integer, String,
Boolean>::putAll)
);
Run Code Online (Sandbox Code Playgroud)
出现错误 - HashBasedTable :: putAll使用Oracle的1.8 jre
我正在尝试SELECT MAX(COUNT DISTINCT field_x) FROM stream GROUP BY field_y;使用Java Streams/Collectors在一个groovy脚本中做一个.基本上,我想要一个解决方案COUNT DISTINCT,我可以接受.max.
我一直在尝试这篇文章中的解决方案:java 8 - stream,map和count distinct
但得到错误:
unexpected token: : @ line 65, column 114.
")}, Collectors.toSet()), Set::size).val
Run Code Online (Sandbox Code Playgroud)
Groovy中似乎有一个问题Set::size和Map::size.
我已经导入都java.util.Map和java.util.Set无济于事.这是Groovy语法/导入Java类的问题还是我正在使用的问题Collectors?作为参考,我只是尝试在原始后期解决方案中在此地图上实现forEach println:
Map<Integer, Integer> map = bids.stream().collect(
groupingBy(
Bid::getBidderUserId,
collectingAndThen(
mapping(Bid::getAuctionId, toSet()),
Set::size)));
Run Code Online (Sandbox Code Playgroud)
如果这更适合作为评论而道歉,但显然需要更多的声誉来评论而不是提问.
AFAIK总结流的唯一方法BigDecimal是:
BigDecimal result = stream.reduce(BigDecimal.ZERO, BigDecimal::add);
Run Code Online (Sandbox Code Playgroud)
这里的问题是每次调用BigDecimal::add都会创建一个新的BigDecimal而不是更改一个可变类型.
是否有一个可变减少操作又名Collector为Stream<BigDecimal>?
我有一个包含以下代码的小方法:
final int year = getYear();
final Carrier carrier = getCarrier();
final CarrierMetrics metrics = new CarrierMetrics(carrier);
repository.getFlightStream(year)
.filter(flight -> flight.getCarrier().equals(carrier))
.forEach(flight -> {
metrics.addFlight(flight);
printf("%,10d\t%,10d\t%,10d\t%,10d\r",
metrics.getTotalFlights(),
metrics.getTotalCancelled(),
metrics.getTotalDiverted(),
metrics.getAirports().size()
);
});
Run Code Online (Sandbox Code Playgroud)
希望很明显,我正在做的是在处理流中的每个Flight时累积指标.代码确实有效,但我想知道是否有更好的(更多功能)方法来实现这种行为,可能使用收集器.任何反馈都表示赞赏.
谢谢,
托尼
我有简单对象的列表:
private String unit;
private Double value;
Run Code Online (Sandbox Code Playgroud)
列表看起来像这样:
f, 1.0;
ml, 15.0;
g, 9.0
Run Code Online (Sandbox Code Playgroud)
我创建了一个简单的函数,希望将这些值分组并以unit为键将它们放入地图,并将对象列表作为值,但是我想像在原始列表中那样保存顺序。这是我目前的解决方案:
myList.stream()
.collect(groupingBy(MyObject::getUnit));
Run Code Online (Sandbox Code Playgroud)
但是之后,我的地图按字母顺序排序:f,g,ml,而不是f,ml,g。有没有其他分组方法可以解决?
collectors ×10
java ×10
java-stream ×7
java-8 ×6
collections ×1
generics ×1
groovy ×1
grouping ×1
guava ×1
lambda ×1
list ×1
sorting ×1