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

多个选项,选择最好的?[重复]

空枫涟
2023-03-14

我有一个可以包含多个可选ID的类,该类将选择第一个可用ID并将其返回给调用方。像下面这样。

Optional<Phone> homePhone;
Optional<Phone> mobilePhone;
Optional<Phone> emergencyPhone;

Phone getBestPhone() {
  return homePhone.map(p -> p)
           .orElse(mobilePhone.map(p -> p)
             .orElse(emergencyPhone.map(p -> p)
               .orElseThrow(() -> new IllegalArgument("No valid phone")))));
}

我想使用像map和orElse这样的可选方法,但在这种情况下,它会导致太多的嵌套。另外两个伪代码选项可能是。

Phone getBestPhone() {
  homePhone.ifPresent(p -> { return p; });
  mobilePhone.ifPresent(p -> { return p; });
  emergencyPhone.ifPresent(p -> { return p; });
  throw new IllegalArgument("...");
}
Phone getBestPhone() {
  return FirstPresent(homePhone, mobilePhone, emergencyPhone);
}

有没有比我现有的方法更好的方法?我很想通过做香草isPresent()检查来避免嵌套。

共有1个答案

解高昂
2023-03-14

IMO,firstPersend方法似乎更具可读性和可扩展性。我们可以使用Stream#of(T...)方法将这些可选包装到一个流,然后找到第一个礼物。

import java.util.Optional;
import java.util.stream.Stream;

public class GetFirstPresent {
    public static void main(String[] args) {
        Optional<Phone> homePhone = Optional.empty();
        Optional<Phone> mobilePhone = Optional.empty();
        Optional<Phone> emergencyPhone = Optional.of(new Phone("e123"));
        Phone phone = firstPresent(homePhone, mobilePhone, emergencyPhone);
        System.out.println(phone.id);
        try {
            firstPresent(homePhone, mobilePhone);
        } catch (IllegalArgumentException e) {
            System.out.println(e);
        }
    }

    @SafeVarargs
    private static Phone firstPresent(Optional<Phone>... phones) {
        return Stream.of(phones).filter(Optional::isPresent)
                .findFirst().map(Optional::get).orElseThrow(() -> {
                    return new IllegalArgumentException("No phone present");
                });
    }

    private static class Phone {
        public Phone(String id) {
            super();
            this.id = id;
        }

        private String id;
    }
}

一个缺点是我们需要@SafeVarargs来抑制警告,这是无法避免的,根据“为varargs参数创建T的通用数组”编译器警告,有可能解决吗?

 类似资料:
  • 问题内容: 所以,我想用香草JS做的事情很简单,但是我使用的是AngularJS,我想知道如何在框架内以最佳方式做到这一点。我想在多个选择框中更新所选的选项。我不想添加或删除任何选项。这是我的HTML外观: 使用以下数组,我想以编程方式从此列表中选择/取消选择选项: 当我在范围中设置此数组时,我希望选择框取消选择不是蓝色或红色的任何内容,然后选择蓝色和红色。我在Google网上论坛上看到的标准回复

  • 我想调用一个函数时,选择的任何选项。类似于这样: 但不知何故不起作用。有人能帮忙吗。 请注意 我不想捕获更改事件,如果我选择已经选择选项,则不会触发更改事件

  • 我使用的是一个具有多个属性的select元素。这只适用于Firefox和Chrome,但不适用于IE9/IE10或IE11。有什么建议让它也适用于IE浏览器吗?看起来IE不接受字符=>

  • 问题内容: 我想选择,,从多个选择其中有10个选项。我只想选择这三个选项。 HTML代码: selenium键代码: 我尝试使用此代码。使用此代码,我可以选择第一个选项,即“ P0_ENGLISH”。但是,选择第一个选项后,我得到一个错误: 问题答案: 要从 Multi Select 元素中选择多个 选项 ,可以使用 ActionChains 模拟 Control单击* ,如下所示: *

  • 我正在进行单选和多选测试。 我有几个问题,每个问题有4个答案。 当每个答案都被分配到单选按钮时,我正在随机排列答案。这就是我洗牌arraylist的方式,Random是一个带有项目的arraylist,r1、r2、r3、r4是单选按钮。 我能够以混乱的方式显示答案,但当我选择答案时,我需要显示答案是正确的还是错误的。 正确答案是B我需要显示正确答案是B。 如何做到这一点。 编辑:我已经尝试过了:

  • 问题内容: 尝试在angularjs中选择关于对象值的多个选项 这是一个代码: 和html jsfiddle上的(非)工作示例 http://jsfiddle.net/andrejkaurin/h9fgK/ 问题答案: 您尝试使用选择倍数(如复选框列表),这有点奇怪。多选输出一个数组。您不能将ng- model放在这样的选项标签上,而是放在选择本身上。因此,由于select将输出值数组,因此您需要