小编rci*_*222的帖子

java 8如何在多个属性上获取不同的列表

如何从对象列表中获得不同的(基于两个属性的不同)列表.例如,让我们有属性名称和价格的对象列表.现在我如何获得具有不同名称或价格的列表.
假设

list<xyz> l1 = getlist(); // getlist will return the list.
Run Code Online (Sandbox Code Playgroud)

现在让l1具有以下属性(名称,价格): -
n1,p1
n1,p2
n2,p1
n2,p3

现在在过滤器之后,列表应为-n1
,p1
n2,p3

我试着像这样解决 -

public List<xyz> getFilteredList(List<xyz> l1) {

        return l1
                .stream()
                .filter(distinctByKey(xyz::getName))
                .filter(distinctByKey(xyz::getPrice))
                .collect(Collectors.toList());
    }

    private static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
        Map<Object,Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }
Run Code Online (Sandbox Code Playgroud)

现在的问题是当我对名称进行过滤时,列表返回将是 -
n1,p1
n2,p1

然后它将在价格上运行过滤器返回 -
n1,p1

这不是预期的结果.

java lambda distinct-values java-8 java-stream

8
推荐指数
2
解决办法
2万
查看次数

使用java stream过滤谓词时记录过滤器的结果

场景是我创建了不同类型的过滤器,它们根据对象的属性过滤一些对象的列表.

所以为此我创建了一个每个过滤器继承的AbstractObjectFilter类.
AbstractObjectFilter.java

public abstract class AbstractEventFilter
{
    protected abstract Predicate<IEvent> isEligible();

    public List<IEvent> getFilteredEvents(final List<IEvent> events)
    {
        return events.stream().filter(isEligible()).collect(Collectors.toList());
    }
}
Run Code Online (Sandbox Code Playgroud)

所以现在每个过滤器都扩展了这个类并覆盖了isEligible(),并且在该函数中它根据其属性返回谓词.

例如: - MinNumOfPrizesFilter.java

public class MinimumNumOfPrizesFilter extends AbstractEventFilter
{
    private int minimumNumOfPrizes;

    public MinimumNumOfPrizesFilter(@NonNull int minimumNumOfPrizes)
    {
        this.minimumNumOfPrizes = minimumNumOfPrizes;
    }

    @Override
    protected Predicate<IEvent> isEligible()
    {
        return event -> event.getPrizeCount() >= minimumNumOfPrizes;
    }
}
Run Code Online (Sandbox Code Playgroud)

同样,我创建了许多其他过滤器.有一个applyFilter函数迭代过滤器对象列表,并通过调用getFilteredEvents函数继续应用过滤器.

现在我如何记录每个事件的命运例如 - "x1事件由MinNumOfPrizesFilter过滤器过滤.x1的奖励数量 - 10,所需的最低奖励数量 - 20"

java logging filter java-8 java-stream

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

标签 统计

java ×2

java-8 ×2

java-stream ×2

distinct-values ×1

filter ×1

lambda ×1

logging ×1