在java中使用函数式接口

问题描述 投票:0回答:1

我有

ProductSettings
ProductType
。产品设置决定是否启用产品类型。

ProductSettings productSettings = new ProductSettings()
            .setIsTreasuryInfoEnabled(true)
            .setIsTreasurySwiftInfoEnabled(true)
            .setIsTreasuryExecutionControlEnabled(true)
            .setIsAcceptEnabled(true);

public enum ProductType {
INFO,
INFOSWIFT,
BUDGETCONTROL,
ACCEPT,
DIRECTACCOUNTCONTROL

我如何使用功能界面和 vs 任务填充

enabledProductTypes
集 - 通过产品类型启用设置?

Set<ProductType> enabledProductTypes = EnumSet.noneOf(ProductType.class);

我创建了地图

static Map<ProductType, Predicate<ProductSettings>> mapGetter = new HashMap<>();

static Map<ProductType, BiConsumer<ProductSettings, Boolean>> mapSetter = new HashMap<>();

并用这样的谓词填写

mapGetter 

mapGetter.put(ProductType.ACCEPT, ProductSettings::getIsAcceptEnabled);


mapGetter.put(ProductType.INFO,ProductSettings::getIsTreasuryInfoEnabled);

并用 BiConsumer 填写

mapSetter
,如下所示:

mapSetter.put(ProductType.ACCEPT, ProductSettings::setIsAcceptEnabled);

mapSetter.put(ProductType.INFO, ProductSettings::setIsTreasuryInfoEnabled);

但是如何使用它我不明白。 我想我应该迭代我的地图

java function predicate consumer functional-interface
1个回答
0
投票

是的,您应该迭代您的地图。

ProductSettings settings = /* ... */;

Set<ProductType> enabledProductTypes = EnumSet.noneOf(ProductType.class);

for (Map.Entry<ProductType, Predicate<ProductSettings>> entry : mapGetter) {
    ProductType type = entry.getKey();
    Predicate<ProductSettings> enabled = entry.getValue();

    if (enabled.test(settings)) {
        enabledProductTypes.add(type);
    }
}

并且:

ProductSettings settings = /* ... */;
Set<ProductType> enabledProductTypes = /* ... */

for (Map.Entry<ProductType, BiConsumer<ProductSettings, Boolean>> entry : mapSetter) {
    ProductType type = entry.getKey();
    BiConsumer<ProductSettings, Boolean>> setter = entry.getValue();

    setter.accept(settings, enabledProductTypes.contains(type));
}
© www.soinside.com 2019 - 2024. All rights reserved.