Tag: functional programming

function性Java – whenComplete和exception之间的交互

在这段代码中: doSomethingThatMightThrowAnException() .whenComplete((result, ex) -> doSomethingElse()}) .exceptionally(ex -> handleException(ex)); 当doSomethingThatMightThrowAnException存在exception时, doSomethingElse和handleException运行,或者是whenComplete还是exception消耗的exceptionally ? 编辑: doSomethingThatMightThrowAnException返回一个CompletableFuture ,它可能会CompletableFuture completeExceptionally 。 这是我所说的例外。

在Java 8中使用Lambda对ArrayList进行排序

有人能告诉我一个快速的例子,说明如何使用新的lambda语法在Java 8中按字母顺序对ArrayList进行排序。

RxJava:如何用依赖关系组合多个Observable并在最后收集所有结果?

我正在学习RxJava,并且,作为我的第一个实验,试图在这段代码中重写代码 (在Netflix的博客上引用作为RxJava可以帮助解决的问题),以使用RxJava改进其异步性,即所以它在继续执行其余代码之前,不会等待第一个Future( f1.get() )的结果。 f3取决于f1 。 我看到如何处理这个问题, flatMap似乎可以解决这个问题: Observable f3Observable = Observable.from(executor.submit(new CallToRemoteServiceA())) .flatMap(new Func1<String, Observable>() { @Override public Observable call(String s) { return Observable.from(executor.submit(new CallToRemoteServiceC(s))); } }); 接下来, f4和f5取决于f2 。 我有这个: final Observable f4And5Observable = Observable.from(executor.submit(new CallToRemoteServiceB())) .flatMap(new Func1<Integer, Observable>() { @Override public Observable call(Integer i) { Observable f4Observable = Observable.from(executor.submit(new CallToRemoteServiceD(i))); Observable f5Observable […]

Java 8流和地图值得吗?

感觉就像java 8流和映射函数那么冗长,它们并不是真正的改进。 例如,我编写了一些使用集合生成另一个修改过的集合的代码: private List getDartFields(Class model) { List fields = new ArrayList(); for (Field field : model.getDeclaredFields()) { if (!Modifier.isStatic(field.getModifiers())) { fields.add(DartField.getDartField(field)); } } return fields; } 这似乎是java 8流及其function的理想用例,所以我重写了它: private List getDartFields(Class model) { return Arrays.asList(model.getDeclaredFields()) .stream() .filter(field -> !Modifier.isStatic(field.getModifiers())) .map(field -> DartField.getDartField(field)) .collect(Collectors.toList()); } 但我不确定我更喜欢那个。 这是236个字符,而普通风格的java则是239个字符。 它似乎没有或多或少可读。 很高兴您不必声明ArrayList ,但需要调用.collect(Collectors.toList())和Arrays.asList (取决于数据类型)并不是更好。 使用像我这样的.stream()是否有一些实际的改进,或者这只是一种有趣的方式来抛弃任何不知道函数式编程的循环的同事? 我想如果我动态地传递filter或映射lambdas它会很有用,但如果你不需要这样做……

用于function接口的Java 8 lambda模糊方法 – 目标类型

我有以下代码: public class LambdaTest1 { public static void method1(Predicate predicate){ System.out.println(“Inside Predicate”); } public static void method1(Function function){ System.out.println(“Inside Function”); } public static void main(String[] args) { method1((i) -> “Test”); } } 这给我一个错误信息 “方法method1(谓词)对于LambdaTest1类型是不明确的”。 我可以看到,对于Function和Consumerfunction接口,输入参数是Integer 。 但是对于Function ,返回类型是String 。 由于我的lambda调用具有返回值“Text” – 这应该调用我的Function函数接口而不是抛出此错误。 任何人都可以解释这种行为背后的原因吗? 另一个例子: public class LambdaTest1 { public static void method1(Consumer consumer){ System.out.println(“Inside Consumer”); […]

Java 8中Optional类型的有效用法

这是Java 8中Optional类型的有效(预期)用法吗? class Foo { private final Integer id; private final String name; private final String countryCode; Foo(final Integer id, final String name, final String countryCode) { this.id = id; this.name = name; this. countryCode = countryCode; } public String getName() { return name; } public String getCountryCode() { return countryCode; } } class FooSrv […]

RxJava是否适合分支工作流程?

我正在使用RxJava来处理我们从队列中提取的一些通知。 RxJava似乎在一个简单的工作流程中运行良好,现在有了新的要求,流程越来越复杂,分支越多(请参见下图作为参考) 我尝试通过一个小unit testing来举例说明流程: @Test public void test() { Observable.range(1, 100) .groupBy(n -> n % 3) .toMap(GroupedObservable::getKey) .flatMap(m1 -> { Observable ones1 = m1.get(0); Observable twos1 = m1.get(1).map(n -> n – 10); Observable threes = m1.get(2).map(n -> n + 100); Observable onesAndTwos = Observable.merge(ones1, twos1) .map(n -> n * 3) .groupBy(n -> n % 2) […]

Scala到Java(函数式编程)

我被要求将一些Scala代码“翻译”为Java以用于课程。 但是,分配的要求是不允许使用 Java 8和外部库,例如Functional Java和Totally Lazy 。 Scala中的行是: charges.groupBy(_.cc).values.map(_.reduce(_ combine _)).toList 我已经能够编写groupBy和values但.map和_.reduce仍然_.reduce 。 我已经查看了这两个库的源代码以及Scala源代码,试图找到一些东西来帮助我将它们放在一起,但是我还没有取得任何进展。 GroupBy实现如下: public Map<CreditCard, List> groupBy(List list) { Map<CreditCard, List> map = new TreeMap<CreditCard, List>(); for(Charge c: list) { List group = map.get(c.cc); if(group == null) { group = new ArrayList(); map.put(c.cc, group); } group.add(c); } return map; }

用于解决fibonacci的Java 8 Lambda表达式(非递归方式)

我是Java 8中使用Lambda表达式function的初学者.Lambda表达式在解决Prime数字检查,阶乘等程序方面非常有用。 然而,它们可以有效地用于解决像Fibonacci这样的问题,其中当前值取决于前两个值的总和。 我已经很好地使用Lambda表达式有效地解决了素数检查问题。 下面给出了相同的代码。 boolean checkPrime=n>1 && LongStream.range(2, (long) Math.sqrt(n)).parallel().noneMatch(e->(n)%e==0); 在上面的noneMatch方法代码中,我们使用范围中的当前值( e )进行评估。 但对于Fibonacci问题,我们需要前两个值。 我们怎样才能实现呢?

抽象类作为function接口

在java 8中,只有一个抽象方法的抽象类不是函数接口( JSR 335 )。 该interface是一个function界面: public interface MyFunctionalInterface { public abstract void myAbstractMethod(); public default void method() { myAbstractMethod(); } } 但是这个abstract class不是: public abstract class MyFunctionalAbstractClass { public abstract void myAbstractMethod(); public void method() { myAbstractMethod(); } } 所以我不能使用抽象类作为lambda表达式和方法引用的目标。 public class Lambdas { public static void main(String[] args) { MyFunctionalAbstractClass functionalAbstractClass = () […]