domain对象
public class Dish {
public Dish(String name, boolean vegetarian, int calories, Type type) {
this.name = name;
this.vegetarian = vegetarian;
this.calories = calories;
this.type = type;
}
public String getName() {
return name;
}
public int getCalories() {
return calories;
}
public boolean isVegetarian() {
return vegetarian;
}
public Type getType() {
return type;
}
private final String name;
private final boolean vegetarian;
private final int calories;
private final Type type;
public enum Type {MEAT, FISH, OTHER}
}
自己实现的Collector
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
public class ToListCollector<T> implements java.util.stream.Collector<T, List<T>, List<T>> {
@Override
public Supplier<List<T>> supplier() {
return ArrayList::new;
// return () -> new ArrayList<>();
}
@Override
public BiConsumer<List<T>, T> accumulator() {
// return List::add;
return (list, item) -> list.add(item);
}
@Override
public Function<List<T>, List<T>> finisher() {
return Function.identity();
}
@Override
public BinaryOperator<List<T>> combiner() {
return (list1, list2) -> {
list1.addAll(list2);
return list1;
};
}
@Override
public Set<Characteristics> characteristics() {
return Collections.unmodifiableSet(
EnumSet.of(Characteristics.IDENTITY_FINISH, Characteristics.CONCURRENT)
);
}
}
测试用例
import chapter4.Dish;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Test {
private static List<Dish> menu = Arrays.asList(
new Dish("pork", false, 800, Dish.Type.MEAT)
, new Dish("beef", false, 700, Dish.Type.MEAT)
, new Dish("chicken", false, 400, Dish.Type.MEAT)
, new Dish("french fries", true, 530, Dish.Type.OTHER)
, new Dish("rice", true, 350, Dish.Type.OTHER)
, new Dish("season fruit", true, 120, Dish.Type.OTHER)
, new Dish("pizza", true, 550, Dish.Type.OTHER)
, new Dish("prawns", false, 300, Dish.Type.FISH)
, new Dish("prawns", false, 300, Dish.Type.FISH)
, new Dish("salmon", false, 450, Dish.Type.FISH) );
public static void main(String[] args) {
List<Dish> list1 = menu.stream().collect(Collectors.toList());
List<Dish> list2 = menu.stream().collect(new ToListCollector<Dish>());
System.out.println(list1.equals(list2));
}
}
本文介绍了一个自定义的Collector实现,用于收集Java Stream中的元素到List中,并展示了如何设计一个包含菜品名称、是否素食、热量和类型等属性的Dish对象。通过比较自定义Collector与内置Collectors.toList()的使用,验证了两者的等效性。
2030

被折叠的 条评论
为什么被折叠?



