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

提供给orElse()的方法不会完全执行

柴嘉石
2023-03-14

在下面的代码中,我试图理解java-8中提供的可选的概念。我创建了下面的例子来掌握orElse()背后的原理。执行代码后,defaultmethod()的主体被执行,并返回

new User("DEFAULT_USER", "default@gmail.com", "0000", null);

对象y。log语句按照我的预期打印了正确的数据。

问题是,为什么defaultMethod()中的所有日志都没有打印??引入is-orElse()仅返回值,而不执行所提供方法的整个主体。?

代码:

 @Override
protected void onResume() {
    super.onResume();

    User user_1 = this.getUser_1();
    User user_2 = this.getUser_2();
    User user_3 = this.getUser_3();

    User y = OptionalsUtils.toOptional(user_1)
            .map(u1 -> this.getUser_3())
            .orElse(this.defaultMethod());
    Log.i(TAG_LOG, "orElse->y: " + y.getUserName());

}

private User getUser_3() {
    List<String> list = new ArrayList<String>(5);
    list.add("espn");
    list.add("qtv");
    list.add("der Spiegel");
    list.add("deutsch welle");

    User user = new User();
    user.setUserName("johannas");
    user.setUserEmailAddres("joha90@gmail.com");
    user.setUserId("2345");
    user.setUserFavoritesTvList(null);
    return null;
}

private User defaultMethod() {
    Log.w(TAG_LOG, "defaultMethod is called1");
    Log.w(TAG_LOG, "defaultMethod is called2");
    Log.w(TAG_LOG, "defaultMethod is called3");
    Log.w(TAG_LOG, "defaultMethod is called4");
    Log.w(TAG_LOG, "defaultMethod is called5");
    Log.w(TAG_LOG, "defaultMethod is called5");
    Log.w(TAG_LOG, "defaultMethod is called5");
    Log.w(TAG_LOG, "defaultMethod is called5");

    return new User("DEFAULT_USER", "default@gmail.com", "0000", null);
}

日志:

2018-12-17 12:46:15.774 20158-20158/com.example.optionals_00 W/ActMain: defaultMethod is called1
2018-12-17 12:46:15.774 20158-20158/com.example.optionals_00 W/ActMain: defaultMethod is called2
2018-12-17 12:46:15.774 20158-20158/com.example.optionals_00 W/ActMain: defaultMethod is called3
2018-12-17 12:46:15.774 20158-20158/com.example.optionals_00 W/ActMain: defaultMethod is called4
2018-12-17 12:46:15.774 20158-20158/com.example.optionals_00 W/ActMain: defaultMethod is called5
2018-12-17 12:46:15.774 20158-20158/com.example.optionals_00 W/ActMain: defaultMethod is called5
2018-12-17 12:46:15.774 20158-20158/com.example.optionals_00 I/ActMain: orElse->y: DEFAULT_USER

共有1个答案

龙学
2023-03-14

这不是与orElse相关的问题。Logcat将跳过缺少的这两行,因为它们是相同的。

如果Logcat检测到重复的日志,它将只显示第一个和最后一个日志,在这两个日志之间,您应该能够看到与此类似的消息:

04-16 03:24:21.591 I:uid=10085(u0_a85)xxx。yyy。zzz相同2行

这种行为始于Android Studio的版本3.1。为了解决这个问题,出现了一个问题,因为很多人不喜欢它,所以它在Android Studio的3.2版本中被删除。因此,如果您使用Android Studio3.03.2,则应显示所有日志,即使它们完全相同。

 类似资料:
  • 我有3种方法需要并行运行,因为它们彼此独立,并在最后合并每种方法的结果,并将其作为响应发送。我还需要处理异常。 在不同的帖子中,我找到了下面的代码并进行了相应的修改。 上述各项是否应正确并行运行?我知道这需要更多的时间,我想确保我做对了。

  • 1和2都是有效的,因为没有标准化的行为,由媒体类型决定如何处理它。这感觉不对,因为PUT不是从属于资源本身,而是替换资源。 请记住,我不是在问什么是正确的,什么是有意义的。我在问哪一个是标准支持的。

  • 我编写了两个功能文件,每个功能文件打开不同的浏览器URL,例如一个是open google。com和secnd一个开放的亚马逊。但事实并非如此。 两个浏览器都打开了谷歌。通用域名格式。此外,它不能与浏览器交互,任何编码到浏览器的操作都不会执行。此外,关闭第一个浏览器会导致第二个浏览器出现空指针异常。 cucumber版本6我从AbstractCucumberTesNG继承开始。然后我创建登录。功能

  • 问题内容: 有人知道为什么JUnit 4提供但不提供方法吗? 它提供了(对应于)和(对应于),因此它们似乎没有包含在内就显得很奇怪。 顺便说一下,我知道JUnit插件提供了我正在寻找的方法。我只是出于好奇而问。 问题答案: 我建议您使用较新的样式断言,该断言可以轻松描述各种否定形式,并在断言失败时自动构建对您的期望和得到的结果的描述: 这三个选项都是等效的,请选择最容易阅读的一个。 要使用方法的简

  • 我很想知道为什么Java的可选不提供类似于流的方法。 接口的method javadoc声明: @apiNote此方法主要用于支持调试,您希望在元素流经管道中的某个点时看到这些元素 这几乎完全描述了我的用例: (返回 方法,上述所有内容都会转换为: 也可以这样做(参见此答案): 并将其与方法一起使用: 但我认为这是一个黑客,而不是的干净用法。 从Java 9开始,可以将< code>Optiona

  • 我编写了一个类,它的一系列实例将从AsyncTask调用,它将从方法runReport()返回一个结果。它很好地创建了一个工作线程,但由于某种原因,它不执行可调用的call()方法。我做错了什么? null 我愿意用更好的方法来做这件事。我最初让AsyncTask进行这个调用,然后在它的线程上运行looper.loop(),但是我无法处理这些对象的队列,因为我需要在返回结果之前从侦听器调用loop