它可以使函数返回true,false或对象列表吗?

时间:2018-03-16 10:24:35

标签: java information-retrieval data-handling

该计划简介

我正在开发一个存储以下数据的程序:

- 事实:属性列表(或仅一个)和true / false值(称为“真值”值)的组合。例如:

  

父母('John','John jr'),真实

其中John的父项为John jr的属性为真。我用来存储事实的代码:

public class Fact implements Serializable{
    private boolean truth;
    private ArrayList<Property> properties;

    public Fact(){
        truth = false;
        properties = new ArrayList<Property>();
    }

    //more constructors, getters, setters and other functions  which are not important for this question...

- 规则:用于从事实中获取信息。他们的工作是通过一个事实(我称之为衍生事实)暗示另一个事实(我称之为暗示事实):

  

parent('x','y')=&gt;孩子('y','x')

这意味着通过将规则应用于上述事实,我们可以确定John jrJohn的孩子。

规则的属性:

消极:

规则可以是“正面的”(如果导数为真,则impliant为真):

  

parent('x','y')=&gt;孩子('y','x')

或“negative”(如果导数为true,则impliant为false):

  

parent('x','y')=&gt;不是孩子('y','x')

可逆性:

它们也可以是“逆转的”(如果衍生物是假的,则暗示是真/假):

  

不是父母('x','y')=&gt;孩子('y','x')

或(如果也是否定的):

  

不是父母('x','y')=&gt;不是孩子('y','x')

或“非逆转”(如果衍生产品为假,则不明确):

  

不是父母('x','y')=&gt; (未知)

我用来存储规则的代码如下:

public class Rule implements Serializable{
    private Property derivative;
    private Property impliant;
    private boolean negative;
    private boolean reversive;

    public Rule(Property derivative, Property impliant) throws InvalidPropertyException{
        if(!this.validRuleProperty(derivative) || !this.validRuleProperty(impliant))
            throw new InvalidPropertyException("One or more properties are invalid");
        this.derivative = derivative;
        this.impliant = impliant;
        negative = false;
        reversive = false;
    }

    //again more constructors, getters, setters and other functions  which are not important for this question...

InformationSets

事实和规则存储在InformationSets中,它们将这些事实和规则捆绑在一起,以便用户可以“质疑”其中的信息。这可以通过两种不同的方式完成:

1.Fact Check:检查事实是否属实。根据事实,这将基于该事实的真值返回真或假。例如,用户可以询问:

  

父母('John','John jr')?

,程序将在true时返回:

  

父母('John jr','John jr')?

将返回false

问号表示用户想要询问“事实检查”问题。

1.Impliant Check:对于给定的事实(称为问题 - 事实),这将返回可应用于问题事实的每个规则的事实列表。例如:

  

父母('John','John jr')=&gt;

这将返回:

  

孩子('John jr','John')

箭头表示用户想要询问“Impliant check”问题。

问题编码如下:

public class Question {
    Fact questionFact;
    String operator;

    public Question(Fact questionFact, String operator) throws InvalidOperatorException{
        if(!validOperator(operator))
            throw new InvalidOperatorException("The operator is invalid");
        this.questionFact = questionFact;
        this.operator = operator;
    }

Operator字段中,我根据用户想要提出的问题存储?=>

问题

我目前正处于需要编写将向给定信息集提问的方法的位置。所以我需要一个给出问题和信息集的方法返回truefalse或事实列表。据我所知,这在java中是不可能的。

我尝试为每个问题制作一个单独的方法,但这也会导致问题,因为我希望能够写出类似的内容:

informationSet.ask(question);

并让ask()方法处理这两种类型的问题,所以我不必检查用户在用户界面代码中询问的问题类型,而是检查程序的后端解决它。

这可能是一个很好的方法吗?

2 个答案:

答案 0 :(得分:2)

因此,最明显的解决方案是实现自定义响应类。

另一个想法是考虑使用来自EitherVavrMockk是一种解决方案,旨在独立地保存A或B类型的(双关语!)值。

所以,它可能看起来像:

Either<Boolean, List<Fact>> result = foo();

然后,您可以利用FP Optional / Stream API来操作结果:

如果您想访问左侧:

result.left()
  .map(...)
  .filter(...)
  // ...

如果您想访问右侧:

result.right()
  .map(...)
  .filter(...)
  // ...

答案 1 :(得分:0)

除了 Grzegorz 的提议之外,你应该记住Java是强类型的。这并不意味着您无法返回 Either 对象;根据定义,它可以包含不同的类(类型)。

但是在Java逻辑中,我认为以更窄的粒度实现更多指定方法会更好(这在面向对象设计中有很多好处,比如共享代码和可伸缩性)。

所以我建议提出两种方法,一种用于布尔值,另一种用于数组结果。然后在调用函数中进行条件测试。