我想在我将要教授的课程中使用Functional Java或Guava(或者不太可能使用Scala).尽管在JVM上运行了很多函数式语言,但我仍然希望看到与Java尽可能相似的东西,即在Java 8中具有的功能特性,在概念和语法上最兼容的东西. .
它看起来像Functional Java和Guava是最好的候选者.我无法在功能,易用性,概念接近直接Java等方面找到任何比较它们的东西.有没有人知道这些库之间的良好比较?
我正在阅读以下问题 - 使用functional-java为Java生产项目添加闭包有多安全?我一直在考虑在我当前的项目中使用Functional Java项目.我想知道Stack Overflow的用户使用Functional Java项目的经历是什么?特别是,我对其中一些细节感到好奇:
我需要计算 Functional Java 中单词列表中元音的数量。如果我有这个清单:
List<String> l = Arrays.asList("hello", "world", "test");
Run Code Online (Sandbox Code Playgroud)
我的想法是“删除”元音,然后以这种方式进行减法:
int tot = l.stream().map(s -> s.replace("a", "")).
map(s -> s.replace("e", "")).
map(s -> s.replace("i", "")).
map(s -> s.replace("o", "")).
map(s -> s.replace("u", "")).
map(s -> s.length()).reduce(0, Integer::sum);
int res = l.stream().map(s->s.length()).reduce(0, Integer::sum)-tot;
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
我很想在Java中使用闭包.我已经读过它们可能会或者可能不会成为Java 7.但是一个名为functional-java的开源项目已经实现了包括闭包在内的功能特性.
在企业生产应用程序中使用这样的库有多安全?
是否有更好的方法来向Java添加闭包?
我有一个hibernate映射的Java对象,JKL它充满了一堆普通的hibernate-mappable字段(比如字符串和整数).
我添加了一个新的嵌入字段(它位于同一个表中 - 而不是映射)asdf,这是一个fj.data.Option<ASDF>.我已经明确表示这个字段实际上可能不包含任何东西(而不是null每次访问它时都必须处理).
如何在我的JKL.hbm.xml文件中设置映射?我想Hibernate来自动转换null数据库到none的fj.data.Option<ASDF>,当它获取对象.还应的一个非空实例转换ASDF到some的fj.data.Option<ASDF>.我还有其他的诡计吗?谢谢.
java functional-programming hibernate option functional-java
我知道纯函数式编程的目标之一是消除可变性,从而排除副作用.但是让我们面对现实吧,即使存在所有的函数式编程库,Java也不是一种函数式语言.事实上,似乎有些FP库知道并期待这一点.例如,在Functional Java中,有一个Effect类.在Jedi FP库中,有Command界面.这允许您 - 除其他外 - 将类型安全的命令模式应用于Iterable没有令人讨厌的for循环样板的元素.
Command<PhoneNumber> makeCall = new Command<PhoneNumber> {
public void execute(PhoneNumber p) { p.call(); }
}
List<PhoneNumber> phoneList = ...
FunctionalPrimitives.forEach( phoneList, makeCall );
Run Code Online (Sandbox Code Playgroud)
所以问题是,番石榴中有类似的东西吗?
在接受澄清后接受回复
我正在开发一个框架,它可以帮助解决大多数Java FP库中固有的"垂直问题",在某些情况下.所以,我不竟让如上图所示的代码示例:即明确宣布一个新的类实现的Command所有其垂直噪声过甜的烦躁,只需在声明之后立即应用它的目的.
我更多地考虑实际的命令模式,其中可能有几个可能的命令在其他地方声明,并且只有其中一个被传递到想要迭代应用它的代码中.此外,我的框架的目标是使创建功能接口对象(函数,谓词,命令,其他简单的lambda)更加惯用,而不是简单地将垂直问题移动到其他地方.我早就意识到这不在番石榴的范围内.但是由于其他FP库中有类似Command的接口,我只想知道Guava中是否存在模拟.
使用我的框架的更完整的代码示例可能是这样的:
class Stuff {
private final Stuff CALLS_TO = callsTo(Stuff.class); // a proxy
public static final Command<Stuff> CMD1 = commandFor(CALLS_TO.someMethod1());
public static final Command<Stuff> CMD2 = commandFor(CALLS_TO.someMethod2());
// methods exist for use elsewhere, but …Run Code Online (Sandbox Code Playgroud) 我的新工作场所大量使用函数式Java Either进行错误处理(http://www.functionaljava.org/javadoc/4.5/functionaljava/fj/data/Either.html)。
几乎根本没有使用异常。
出于多种原因,这是非常令人讨厌的imo。举例说明:方法内的每个api调用(返回Either)必须首先检查返回的Either是否是错误,然后再继续执行下一行。如果是错误,则以Either形式将其传播回方法调用堆栈中。堆栈中的每个方法都还需要检查重新调整的Either中的错误,直到最终我们到达负责处理错误的方法为止。这导致结构非常糟糕的Java代码。我真的不能编写正常的流Java代码,因为我必须在每个api调用上“停止”(因此流不成问题)。例如
Either<Error, Value> myMethod(String someVar) {
Either<Error, Value> valEither someService.getSomething(someVar)
if (valEither.isRight()) {
Either<Error, Value> otherValue someService.getSomethingElse(valEither.right().value())
if (otherValue.isRight()) ..... //you get the idea
} else {
//maybe log
return valEither;
}
}
Run Code Online (Sandbox Code Playgroud)
我当然可以使用Either的单调方法(我也这样做),但这不能解决必须“询问”返回类型(如果有错误或值)的核心问题。为什么我认为将Either用作错误处理基础结构并不是一个好主意,原因有很多(长分配语句,长方法,嵌套泛型等)。
要解决此问题,我想到了可能会为每个正在返回“错误”的api调用抛出特定异常,然后在当前正在使用的顶级方法上捕获一次异常。
Value val = myService.getSomething().rightOrThrow(new MyException("blaa"));
Run Code Online (Sandbox Code Playgroud)
但这似乎是不可能的,因为在Either投影类型上唯一能做类似事情的方法会抛出Java错误,这并不意味着(几乎)在任何情况下都会被捕获(我可能会偶然捕获到stackoverflow或内存不足错误)。
myService.getSomething().right().valueE("some error msg");
Run Code Online (Sandbox Code Playgroud)
有什么建议或想法吗?
谢谢
我使用 fj.data.List 提供的 List 类型在功能 Java 中有一个 List 类型列表
import fj.data.List
List<Long> managedCustomers
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下方法对其进行过滤:
managedCustomers.filter(customerId -> customerId == 5424164219L)
Run Code Online (Sandbox Code Playgroud)
我收到这条消息
根据文档,List 有一个过滤器方法,这应该可以工作 http://www.functionaljava.org/examples-java8.html
我错过了什么?
谢谢
下面显示的是一些使用Java Streams的示例代码。我的问题专门涉及Interface Function<T,R>接受type的输入T并返回type的东西R。
import static java.util.Arrays.asList;
import static java.util.stream.Collectors.groupingBy;
import java.util.List;
import java.util.Map;
public class Dish {
private final String name;
private final boolean vegetarian;
private final String calories;
public Dish(String name, boolean vegetarian, String calories) {
this.name = name;
this.vegetarian = vegetarian;
this.calories = calories;
}
public String getName() {
return name;
}
public boolean isVegetarian() {
return vegetarian;
}
public String getCalories() {
return calories;
}
@Override
public String toString() {
return …Run Code Online (Sandbox Code Playgroud) functional-java ×11
java ×10
guava ×2
closures ×1
either ×1
hibernate ×1
java-8 ×1
map-function ×1
maven ×1
option ×1
side-effects ×1