Java流是否仅用于阵列?单元素呢?

Java流是否仅用于阵列?单元素呢?,java,functional-programming,java-stream,Java,Functional Programming,Java Stream,我一直在研究Java流和函数式编程。 想出了一个重写小“用户登录”代码的方法 这是我的登录方式 如果来自查询的用户为null,则在筛选器上处理null指针异常 公共响应登录(用户请求){ User dbUser=userRepo.findByEmail(request.getEmail()); 如果(!aes.matches(request.getPassword(),dbUser.getPassword())) 返回ResponseEntity.status(403.build(); 返回lo

我一直在研究Java流和函数式编程。
想出了一个重写小“用户登录”代码的方法

这是我的登录方式
如果来自查询的用户为null,则在筛选器上处理null指针异常

公共响应登录(用户请求){
User dbUser=userRepo.findByEmail(request.getEmail());
如果(!aes.matches(request.getPassword(),dbUser.getPassword()))
返回ResponseEntity.status(403.build();
返回logUserIn(dbUser);
}
私有响应属性logUserIn(用户dbUser){
dbUser.setPassword(null);
setJwtCookie(dbUser);
返回ResponseEntity.ok(dbUser);
}
以及通过使用流

公共响应登录(用户请求){
返回Stream.of(userRepo.findByEmail(request.getEmail()))
.filter(dbUser->aes.matches(request.getPassword(),dbUser.getPassword()))
.map(this::logUserIn)
.findFirst()
.orElse(ResponseEntity.status(403.build());
}
私有响应属性logUserIn(用户dbUser){
dbUser.setPassword(null);
setJwtCookie(dbUser);
返回ResponseEntity.ok(dbUser);
}
我不知道溪流是否应该这样使用。是吗?

如果我在项目中更重要的部分使用类似的逻辑,我以后会遇到麻烦吗?

大多数情况下,你会遇到麻烦。“根本”问题是,两种编写方式都可以作为“最佳选择”进行辩护,而java社区大体上更倾向于第二种形式。出于同样的原因,像这样命名变量是个坏主意(社区决定惯例是像这样命名)。打破这种模式意味着你的代码更难被别人阅读,而别人编写的代码也更难为你阅读。此外,当您尝试与其他代码交互时,可能会遇到摩擦

例如,现在(以及在可预见的未来),“lambdas”(那些带有
->
的东西)不是异常透明的,不是控制流透明的,也不是可变局部变量透明的

这里只有3个可行的选择:

  • 以某种方式编写所有代码,使这3张透明胶片与您正在编写的内容无关。我听上去不可能。即使你以某种方式管理,也有其他的库。从
    java.*
    开始,它不是为那种代码风格设计的

  • 混合代码样式,当您没有立即预见到透明胶片的相关性时,使用lambda样式,否则如果是或您认为可能是,则使用更强制的样式。这听起来很傻;当一个样式涵盖所有用例时,为什么要混合两个样式

  • 坚持lambda风格,向后弯曲以解释这3种透明度的不足,这会困扰您,“降级”变量为
    AtomicX
    变量,使用此类结构传输异常和布尔标志,以在外部执行中断和继续控制流,ETETERTA。这只是在写难看的代码,只是因为你特别不喜欢你那漂亮的新闪亮的锤子,坚持把所有问题都当作钉子来处理,不是吗


  • 那是。。试图猜测当你与其他代码和其他程序员交互时会发生什么。这个片段,在真空中,只有你?嗯,两个都很好。不管你喜欢什么,如果社区的话,与其他代码的摩擦,以及保持一致的风格都无关紧要。

    你会遇到麻烦,大多数情况下。“根本”问题是,两种编写方式都可以作为“最佳选择”进行辩护,而java社区大体上更倾向于第二种形式。出于同样的原因,像这样命名变量是个坏主意(社区决定惯例是像这样命名)。打破这种模式意味着你的代码更难被别人阅读,而别人编写的代码也更难为你阅读。此外,当您尝试与其他代码交互时,可能会遇到摩擦

    例如,现在(以及在可预见的未来),“lambdas”(那些带有
    ->
    的东西)不是异常透明的,不是控制流透明的,也不是可变局部变量透明的

    这里只有3个可行的选择:

  • 以某种方式编写所有代码,使这3张透明胶片与您正在编写的内容无关。我听上去不可能。即使你以某种方式管理,也有其他的库。从
    java.*
    开始,它不是为那种代码风格设计的

  • 混合代码样式,当您没有立即预见到透明胶片的相关性时,使用lambda样式,否则如果是或您认为可能是,则使用更强制的样式。这听起来很傻;当一个样式涵盖所有用例时,为什么要混合两个样式

  • 坚持lambda风格,向后弯曲以解释这3种透明度的不足,这会困扰您,“降级”变量为
    AtomicX
    变量,使用此类结构传输异常和布尔标志,以在外部执行中断和继续控制流,ETETERTA。这只是在写难看的代码,只是因为你特别不喜欢你那漂亮的新闪亮的锤子,坚持把所有问题都当作钉子来处理,不是吗

  • 那是。。试图猜测当你与其他代码和其他程序员交互时会发生什么。这个片段,在真空中,只有你?嗯,两个都很好。不管你喜欢什么,如果是社区的话,与其他代码的摩擦以及保持一致的风格都无关紧要。

    Yo
    if (!aes.matches(request.getPassword(), dbUser.getPassword())) {
        return ResponseEntity.status(403).build();
    }
    else {
        return logUserIn(dbUser);
    }
    
    return userRepo.findByEmail(request.getEmail()).map(dbUser -> {
        if (!aes.matches(request.getPassword(), dbUser.getPassword())) {
            return ResponseEntity.status(403).build();
        }
        else {
            return logUserIn(dbUser);
        }
    })... // .orElse(null) / .orElseThrow(...)