Tag: functional programming

在Java 8中的有序列表上进行映射

在Java 8附带的流式库中,我们提供了forEachOrdered API,其文档在此处转载 void forEachOrdered(消费者行为) 对此流的每个元素执行操作。 这是终端操作。 此操作一次一个地处理元素, 如果存在则以遭遇顺序处理 。 在为后续元素执行操作之前,对一个元素执行操作 ,但对于任何给定元素,可以在库选择的任何线程中执行操作。 我们在地图API的订购方面有任何保证吗? 例如,我在代码中有以下内容 private final BazUtils bazUtils; public List getFoos(List bars) { AtomicInteger idx = new AtomicInteger(1); return bars.stream() .map(bar -> bazUtils.getFoo(bar, idx.getAndAdd(1))) .collect(Collectors.toList()); } 在处理过程中是否会遵守bars顺序?

在function上穿越图像的惯用方法

我正在使用Java 8并尝试编写纯函数代码。 在我的最新项目中,我需要逐步浏览图像中的每个像素,并对每个像素执行一些计算。 我提出的代码是这样的: IntStream .range(0, newImage.getWidth()) .forEach(i -> IntStream .range(0, newImage.getHeight()) .forEach(n -> { inspectPixel(i, n, newImage); }) ); 但是,命令式版本是这样的: for (int i = 0; i < newImage.getWidth(); i++){ for (int n = 0; n < newImage.getHeight(); n++){ inspectPixel(i, n, newImage); } } 也许这只是因为我太习惯于命令式编程,但后者似乎比前者更具可读性。 正在发生的事情之一是: 我的代码是错误的,我是以错误的方式进行的吗? 如果是这样,代码应该是什么样的? 您如何在function上遍历任何二维数据结构,而不仅仅是图像? 这实际上是Java 8function方案中程序的最佳版本,这种情况对于函数式编程来说简直很糟糕。

嵌套BiFunction的深度(或限制,如果有的话)是多少

我一直在玩BiFunction ( java.util.function )。 我举了一些例子,我有一个问题。 是否可以使用BiFunction嵌套操作的次数有限制? 是否像想要的那样多次嵌套假设的add(a, b)方法一样简单? 例如三个嵌套的theFunction.apply() public static int methodContainingMethod (int a, int b, int c, BiFunction theFunction) { return theFunction.apply(theFunction.apply(theFunction.apply(a,b),c),c),c); } 四个嵌套theFunction.apply() return theFunction.apply(theFunction.apply(theFunction.apply(theFunction.apply(a,b),c),c),c),c); 嵌套的数量可以继续,我测试嵌套function超过十次。 我没有确切要求需要多少嵌套……但我很好奇这样可以做多少嵌套?

为什么Java 8 Stream forEach方法的行为有所不同?

根据我对java 8 lambda表达式的理解,如果我们在花括号中不包含“ – >”之后的代码,那么将隐式返回值。 但是在下面的示例中, forEach方法期望Consumer和expression返回值,但编译器在Eclipse中没有给出错误。 List messages = Arrays.asList(new StringBuilder(), new StringBuilder()); messages.stream().forEach(s-> s.append(“helloworld”));//works fine messages.stream().forEach((StringBuilder s)-> s.append(“helloworld”)); //works fine messages.stream().forEach(s-> s); // doesn’t work , Void methods cannot return a value messages.stream().forEach(s-> s.toString()); // works fine messages.stream().forEach(s-> {return s.append(“helloworld”);}); // doesn’t work , Void methods cannot return a value messages.stream().forEach((StringBuilder s)-> {return […]

使用functional-java为Java生产项目添加闭包有多安全?

我很想在Java中使用闭包。 我已经读过它们可能会也可能不会成为Java 7.但是一个名为functional-java的开源项目已经实现了包括闭包在内的function特性。 在企业生产应用程序中使用这样的库有多安全? 是否有更好的方法来向Java添加闭包?

将一系列整数分组到函数的答案

对于一系列整数,我想应用(“昂贵的”)操作,仅过滤掉那些有趣答案的整数,然后分组答案。 第一个片段有效,但它在代码和计算中复制了操作(“模数2”): IntStream.range(1, 10).boxed() .filter(p -> (p % 2 != 0)) // Expensive computation .collect(Collectors.groupingBy(p -> (p % 2))); // Same expensive // computation! // {1=[1, 3, 5, 7, 9]} (Correct answer) 我尝试先映射到答案,然后过滤,然后分组 – 但最初的整数当然会在途中丢失: IntStream.range(1, 10).boxed() .map(p -> p % 2) // Expensive computation .filter(p -> p != 0) .collect(Collectors.groupingBy(p -> p)); // {1=[1, […]

创建一个方法,接受可变长度的Function参数,可能有不同的类型

假设我有一个字符串: String s = “1,2,3,4,5,6” 。 我想创建一个方法combineFunctions() ,它将Function s的可变长度序列作为参数,并按该顺序应用所有操作。 这些函数可能有不同的类型。 这种function的示例用法如下: Combine c = new Combine(s); List numbers = c.combineFunctions(splitByComma); Integer max = c.combineFunctions(splitByComma,convertToInt, findMax); 我尝试了什么(这里的在这里没什么用处): public void combineFunctions( Function… functions) { } 但我坚持要获得Function的最后一个类型。 我也在考虑递归方法,但varargs参数必须是最后一个。 是否有可能在Java中实现这样的方法?

我是否可以在Java 8中将Clojure函数用作Lambdas?

我在Clojure中使用了许多库来生成符合“ clojure.lang.IFn ”接口的更高阶函数。 它有多个arity重载,即界面看起来像: public interface IFn extends Callable, Runnable{ public Object invoke() ; public Object invoke(Object arg1) ; public Object invoke(Object arg1, Object arg2) ; public Object invoke(Object arg1, Object arg2, Object arg3) ; …. etc. public Object applyTo(ISeq arglist) ; } 我能否在Java 8中直接使用这种类型的对象作为可调用的lambda函数?

Java 8是否提供了访问者模式的替代方案?

这个关于Stack Overflow的流行答案有关于函数式编程和面向对象编程之间的区别: 当你对事物进行固定的操作时,面向对象的语言是很好的,随着代码的发展,你主要添加新的东西。 这可以通过添加实现现有方法的新类来完成,并且现有类保持不变。 当你有一套固定的东西时 ,函数式语言是很好的,随着代码的发展,你主要在现有的东西上添加新的操作 。 这可以通过添加使用现有数据类型计算的新函数来实现,并且现有函数是独立的。 说我有一个Animal界面: public interface Animal { public void speak(); } 我有一只Dog , Cat , Fish和Bird都可以实现界面。 如果我想向Animal命名为jump()添加一个新方法,我将不得不浏览所有子类并实现jump() 。 访问者模式可以缓解这个问题,但似乎随着Java 8中引入的新function特性,我们应该能够以不同的方式解决这个问题。 在scala我可以很容易地使用模式匹配,但Java还没有真正拥有它。 Java 8实际上是否更容易在现有的东西上添加新操作 ?

使用真值表过滤

想象一个带有布尔标志的Person类,该布尔标志指示该人是否可以使用 – 默认情况下设置为false。 public class Person{ boolean employable = false; … } 现在假设有一些外部布尔方法作用于Person对象。 例如,考虑实用程序类中的静态布尔方法。 public class PersonUtil{ public static boolean ofWorkingAge(Person p){ if(p.getAge() > 16) return true; return false; } … } 布尔静态方法本质上类似于布尔值函数,即谓词 。 我们可以用谓词构造一个2 ^(#谓词)-by-#谓词真值表。 例如,给定三个谓词: ofWorkingAge , ofGoodCharacter , isQualified我们可以构造以下8乘3真值表: TTT TTF TFT TFF FTT FTF FFT FFF 我们现在想雇用具有理想品质的人。 让+表示我们希望考虑某人可就业(即将他们的就业能力标志设为真 )和–相反。 TTT | […]