方法链接好吗?
我并不反对经常使用方法链的函数式编程,而是反对一种从众心态,即人们盲目地追逐新事物。
这个例子,如果我正在使用流编程处理项目列表,并且需要找出导致抛出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
在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
}
这有几个方面。
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中有没有简洁的方法迭代带索引的流?
方法链接好吗?
像往常一样,简单的答案是:视情况而定。
当您
然后当然,链式调用。
如果上述任何一项标准没有得到明确满足,则考虑不这样做。
在任何情况下,在新行上分发您的方法调用可能会有所帮助。当您这样做时,像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本身识别率不高,而且一般网站的验证码都带有大