当前位置: 首页 > 知识库问答 >
问题:

使用Javalambda的外部可配置滤波

拓拔俊德
2023-03-14

假设我有一个外部 JSON,如下所示:

[{
    "condition": "equals",
    "field": "name",
    "value": "jack"
  },
  {
    "condition": "greater",
    "field": "age",
    "value": 25
  }
]

这意味着我想在Person对象列表中检查姓名为< code >“jack”和< code >年龄的人

然而,我想使这个过滤器可配置,也适用于多个过滤器。假设下面的人pojo(这是不言自明的),取姓名和年龄,我如何使过滤器动态或可配置的?

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Accessors and Mutators
}
List<Person> persons = Arrays.asList(
    new Person("mkyong", 30),
    new Person("jack", 20),
    new Person("lawrence", 40)
);

Person result1 = persons.stream()            // Convert to steam
    .filter(x -> "jack".equals(x.getName())) // we want "jack" only
    .findAny()                               // If 'findAny' then return found
    .orElse(null);  

我期待一个因此满足标准的 Person 对象列表。

共有2个答案

公羊瀚
2023-03-14

对此有两种方法。

要么您直接链调用所需的过滤器:

Person result1 = persons.stream()
    .filter(x -> "jack".equals(x.getName()))
    .filter(x -> 25 > x.getAge()) // new filter
    .findAny()
    .orElse(null);

或者,您有自己的类实现Predicate

在这种情况下,您可以使用构建器模式来逐步构建谓词。

你必须面对的困难如下:

  • 处理项之间的布尔关系 (

请注意,Predicate具有方便的方法来链接谓词。

尉迟韬
2023-03-14

据我所知,这与本身几乎没有关系。该过滤器方法只是一个<code>谓词</code>,可以作为实例提供,例如从您可以创建的工厂方法中提供。

static Predicate<Person> fromName(String value){
    return p -> p.getName().equals(value);
}

假设您有另一种方法:

static Predicate<Person> fromAge(int value) {
    return p -> p.getAge() == value;
}

因为< code>Predicate.and,< code>Predicate.or存在,所以您可以:

 fromAge(12).and(fromName("jack"));

从而链接您的谓词

 类似资料:
  • 上一个示例仅展示了java硬编码式的配置,更多的应用场景是使用外部配置文件,灵活配置调度策略,以便于随时改变调度策略,如下是外部配置的代码示例: cron4j=task1, task2 task1.cron=* * * * * task1.class=com.xxx.TaskAaa task1.daemon=true task1.enable=true task2.cron=* * * * *

  • Netflix客户端配置库Archaius 它是所有Netflix OSS组件用于配置的库。Archaius是Apache Commons Configuration项目的扩展。它允许通过轮询源进行更改或将源更改推送到客户端来进行配置更新。Archaius使用Dynamic <Type> Property类作为属性的句柄。Archaius示例 class ArchaiusTest { Dyna

  • Spring Boot允许您外部化配置,以便您可以在不同的环境中使用相同的应用程序代码。 您可以使用属性文件,YAML文件,环境变量和命令行参数来外部化配置。 可以使用@Value注释将属性值直接注入到bean中,通过Spring的Environment抽象访问,或者通过@ConfigurationProperties绑定到结构化对象。 Spring Boot使用一个非常特殊的PropertySo

  • 本文向大家介绍有什么外部配置的可能来源?相关面试题,主要包含被问及有什么外部配置的可能来源?时的应答技巧和注意事项,需要的朋友参考一下 SpringBoot 对外部配置提供了支持,允许我们在不同环境中运行相同的应用。我们可以使用 properties 文件、YAML 文件、环境变量、系统参数和命令行选项参数来声明配置属性。 然后我们可以通过 @Value 这个通过 @ConfigurationPr

  • 基于此http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html文档,但我得到以下错误: 使用注释工作很好,但我真的希望远离它。这方面的任何帮助都是很好的 谢谢 我将此解释为文件${spring.application.name}.properties将从命令行传入

  • 我构建了一个访问数据库并从中提取数据的Spring-Boot应用程序。一切正常,但我想从外部. Properties文件配置表名。 比如: 我想找点东西,但没找到。 您可以使用注释访问外部属性。 所以我的问题是:有没有办法配置表名?或者我可以更改/拦截hibernate发送的查询吗? 解决方案: 好的,hibernate 5适用于。所以我创建了自己的。 此外,这篇关于NamingStrategy的