【问题标题】:method provided to orElse() does not execute altogether提供给 orElse() 的方法不完全执行
【发布时间】:2019-05-17 19:08:53
【问题描述】:

在下面的代码中,我试图理解 java-8 中提供的 Optional 的概念。我创建了下面的示例来掌握 orElse() 背后的原理。 执行完代码,执行了defaultMethod()的body,并返回了

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

反对y。日志语句按照我的预期打印了正确的数据。

问题是,为什么 defaultMethod() 内部的所有日志都没有打印出来?是否引入 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

【问题讨论】:

  • 记录器是否可能决定不记录您传递给它的某些字符串,因为您传递了 4 次相同的字符串?

标签: java android java-8 optional


【解决方案1】:

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

如果 Logcat 检测到重复的日志,它只会显示第一个和最后一个,在这之间你应该可以看到类似这样的消息:

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

此行为始于 Android Studio 的 3.1 版本。一个issue was opened来解决这个问题,因为很多人不喜欢它,所以在Android Studio的3.2版本中被移除了。因此,如果您使用 Android Studio 3.03.2,则应显示所有日志,即使它们相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    相关资源
    最近更新 更多