标签: collectors

用于求和 java 8 float 的自定义收集器实现

我正在尝试创建一个类似于 的自定义浮动添加Collectors.summingDouble()

但我面临两个问题,我不知道如何解决它。

  1. BiConsumer- 第 #27 行 - void 方法不能返回值
  2. 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)

java java-8 java-stream collectors

2
推荐指数
1
解决办法
2808
查看次数

如何使用partitioningBy,然后使用Java Streams分别对结果列表进行排序

我有一个如下所示的对象:

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)

java sorting java-8 collectors

2
推荐指数
1
解决办法
159
查看次数

Java Stream - 收集器内的类型推断问题

我有一个与此堆栈溢出问题类似的用例,并尝试使用它而不将结果存储在 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)

java generics type-inference java-stream collectors

2
推荐指数
1
解决办法
142
查看次数

为什么 Collectors.toList() 不能保证可变性

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)

java collections java-8 java-stream collectors

2
推荐指数
1
解决办法
199
查看次数

Java 8仅映射到值类型集合

我想把我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 lambda java-8 collectors

1
推荐指数
1
解决办法
121
查看次数

Java lang IllegalAccess通过HashBasedTable累加器收集Guava不可变表

执行下面的代码时出错,

引起: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

java guava java-8 collectors

1
推荐指数
1
解决办法
203
查看次数

Set :: size上的groovy错误中的Java流收集器

我正在尝试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::sizeMap::size.

我已经导入都java.util.Mapjava.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)

如果这更适合作为评论而道歉,但显然需要更多的声誉来评论而不是提问.

java groovy java-8 java-stream collectors

1
推荐指数
1
解决办法
333
查看次数

Stream <BigDecimal>是否有可变的减少操作(收集器)?

AFAIK总结流的唯一方法BigDecimal是:

BigDecimal result = stream.reduce(BigDecimal.ZERO, BigDecimal::add);
Run Code Online (Sandbox Code Playgroud)

这里的问题是每次调用BigDecimal::add都会创建一个新的BigDecimal而不是更改一个可变类型.

是否有一个可变减少操作又名CollectorStream<BigDecimal>

java java-stream collectors

1
推荐指数
1
解决办法
241
查看次数

我可以使用Java Stream Collector来实现此行为

我有一个包含以下代码的小方法:

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时累积指标.代码确实有效,但我想知道是否有更好的(更多功能)方法来实现这种行为,可能使用收集器.任何反馈都表示赞赏.

谢谢,

托尼

java java-stream collectors

1
推荐指数
1
解决办法
74
查看次数

Java分组总是在改变顺序

我有简单对象的列表:

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。有没有其他分组方法可以解决?

java grouping list java-stream collectors

1
推荐指数
1
解决办法
66
查看次数