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

识别罪魁祸首的记录 - 编码实践

松建本
2023-03-14

方法链接好吗?

我并不反对经常使用方法链的函数式编程,而是反对一种从众心态,即人们盲目地追逐新事物。

这个例子,如果我正在使用流编程处理项目列表,并且需要找出导致抛出NullPointerException的确切行。

private void test() {
    List<User> aList = new ArrayList<>();
    // fill aList with some data
    aList.stream().forEach(x -> doSomethingMeaningFul(x.getAddress()));
}

private void doSomethingMeaningFul(Address x)   {
     // Do something
}

因此,在上面的示例中,如果list中的任何对象为null,则在调用< code>x.getAddress()时,它将导致< code > NullPointerException 并退出,而没有给我们一个钩子来标识有此问题的用户记录。

我可能错过了在流编程中提供此功能的东西,任何帮助都是值得赞赏的。

编辑1:NPE只是一个例子,但还可能发生其他几个运行时异常。编写筛选器实质上意味着根据我正在执行的操作检查每个 RTE 条件。检查每次手术都会变得很痛苦。

为了更好地理解我的意思,下面是使用旧方法的代码段;我找不到任何与流/函数编程方法等价的方法。

List<User> aList = new ArrayList<>();
// Fill list with some data
int counter = 0;
User u = null;

try {
      for (;counter < aList.size(); counter++) {
          u = aList.get(counter);
          u.doSomething();
          int result = u.getX() / u.getY();
      }
} catch(Exception e)  {
  System.out.println("Error processing at index:" + counter + " with User record:" + u);
  System.out.println("Exception:" + e);
}

This will be a boon during the maintenance phase(longest phase) pointing exact data related issues which are difficult to reproduce.
**Benefits:**
- Find exact index causing issue, pointing to data
- Any RTE is recorded and analyzed against the user record
- Smaller stacktrace to look at

共有3个答案

越嘉石
2023-03-14

在test()函数中,您创建了一个emptylist 列表

在上面做每一件事。首先添加一些元素到

a列表

如果要处理空值,可以添加 .filter(x-

下面是代码

private void test() {
        List<User> aList = new ArrayList<>();

        aList.stream().filter(x-> x != null).forEach(x -> doSomethingMeaningFul(x.getAddress()));
}

private void doSomethingMeaningFul(Address x)   {
        // Do something
}

袁俊弼
2023-03-14

这有几个方面。

1) 空值

最好避免检查空值的问题,不要给空值赋值。这适用于你是否在做函数式编程。不幸的是,许多库代码确实暴露了空返回值的可能性,但是尝试通过在一个地方处理它来限制这种可能性。

不管您是否在做FP,如果您在调用自己的方法时不必编写null检查,您会发现您会少得多的沮丧,因为您自己的方法永远不会返回null。

对于可能为空的变量,另一种方法是使用Java 8的< code>Optional类。

而不是:

public String myMethod(int i) {
     if(i>0) {
          return "Hello";
     } else {
          return null;
     }
}

做:

public Optional<String> myMethod(int i) {
     if(i>0) {
          return Optional.of("Hello");
     } else {
          return Optional.empty();
}

查看< code>Optional Javadoc,了解这如何迫使调用者考虑< code>Optional.empty()响应的可能性。

作为“null表示不存在”和“可选。empty()表示不存在”,您可以使用可选。ofNullable(val),当val==null时返回为空。但请记住,是可选的。empty()可选。of(null)是不同的值。

2)例外

确实,在流处理程序中引发异常效果不佳。异常不是一个非常FP友好的机制。FP友好的替代方案是Aose--它不是Java的标准部分,但很容易自己编写或在第三方库中找到:在Java 8中是否有与Scala的Aly等效的Aly?

public Either<Exception, Result> meaningfulMethod(Value val) {
    try {
       return Either.right(methodThatMightThrow(val));
    } catch (Exception e) {
       return Either.left(e);
    }
}

…然后:

List<Either<Exception, Result>> results = listOfValues.stream().map(meaningfulMethod).collect(Collectors.toList());

3) 索引

当使用由< code>List构成的流时,您想知道流元素的索引?参见Java 8中有没有简洁的方法迭代带索引的流?

卢黎昕
2023-03-14

方法链接好吗?

像往常一样,简单的答案是:视情况而定。

当您

  • 知道你在做什么
  • 非常确定元素永远不会为空,因此在这样的构造中NPE的机会是(接近)0
  • 呼叫的链接提高了易读性

然后当然,链式调用。

如果上述任何一项标准没有得到明确满足,则考虑不这样做。

在任何情况下,在新行上分发您的方法调用可能会有所帮助。当您这样做时,像IntelliJ这样的工具实际上会为您提供每行的高级类型信息(好吧,并不总是,请参阅我自己的问题;)

从另一个角度来看:对于编译器来说,链调用并不重要。这真的只对人类重要。为了可读性或在调试期间。

 类似资料:
  • 在某个try块中,我有两个变量,当我使用和时,这两个变量可能导致。问题是,如果I一个异常,如何知道哪个字符串是麻烦制造者?我需要得到麻烦制造者的变量名。 下面是一些示例代码: 而方法没有告诉我变量名;它只是告诉我捣乱者的内容。 java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)在java.lan

  • 问题内容: 构建失败时,我正在尝试向罪犯发送电子邮件。如果我手动启动构建,则发送电子邮件,但是如果我通过SCM轮询启动构建,则不会发送电子邮件,并且构建的控制台输出将显示以下消息: 这是插件工作的正确方法吗(罪魁祸首应该是一个人,而不是scm polling)? 我正在使用: 操作系统:Ubuntu Server 11.04 Jekins:1.532.1 Email-ext plugin:2.37

  • 如果可能的话,我需要一些意见或建议。我有一个使用语音识别api和媒体记录器的应用程序。该应用程序的要点是当用户说“注意”时,它会记录语音消息,直到用户说“完成”。之后,应用程序将语音消息保存到手机中。 我目前有一个带有按钮(记录、保存、停止、完成)的弹出框,用户可以手动按下按钮来记录他们的语音信息。我正在考虑完全改造用户拥有完全语音控制的应用程序。所以基本上,它越免提越好。 我从这里开始研究连续语

  • 本文向大家介绍python 识别登录验证码图片功能的实现代码(完整代码),包括了python 识别登录验证码图片功能的实现代码(完整代码)的使用技巧和注意事项,需要的朋友参考一下 在编写自动化测试用例的时候,每次登录都需要输入验证码,后来想把让python自己识别图片里的验证码,不需要自己手动登陆,所以查了一下识别功能怎么实现,做一下笔记。 首选导入一些用到的库,re、Image、pytesser

  • 本文向大家介绍Android实现语音识别代码,包括了Android实现语音识别代码的使用技巧和注意事项,需要的朋友参考一下 苹果的iphone 有语音识别用的是Google 的技术,做为Google 力推的Android 自然会将其核心技术往Android 系统里面植入,并结合google 的云端技术将其发扬光大。 所以Google Voice Recognition在Android 的实现就变得

  • 本文向大家介绍python验证码识别的实例详解,包括了python验证码识别的实例详解的使用技巧和注意事项,需要的朋友参考一下 其实关于验证码识别涉及很多方面的内容,入手难度大,但是入手后,可拓展性又非常广泛,可玩性极强,成就感也很足,对这感兴趣的朋友们下面跟着小编一起来学习学习吧。 依赖 利用google ocr来识别验证码 但是pytesseract本身识别率不高,而且一般网站的验证码都带有大