Tag: java 8

monads与Java 8

为了帮助理解monad是什么,有人可以提供一个使用java的例子吗? 他们有可能吗? 如果您从这里下载了预发布的兼容lambda的JDK8,则可以使用java来使用lambdaexpression式: http: //jdk8.java.net/lambda/ 一个使用这个JDK的lambda的例子如下所示,有人可以提供一个相对简单的monad吗? public interface TransformService { int[] transform(List<Integer> inputs); } public static void main(String ars[]) { TransformService transformService = (inputs) -> { int[] ints = new int[inputs.size()]; int i = 0; for (Integer element : inputs) { ints[i] = element; } return ints; }; List<Integer> inputs = new ArrayList<Integer>(5) {{ add(10); […]

Java 7和8中方法的最大大小

我知道Java的方法不能超过64 KB。 这个限制使我们遇到了JavaCC语法生成代码的问题。 我们遇到了Java 6的问题,并能够通过改变语法来解决这个问题。 Java 7的限制已经改变,还是计划用于Java 8? 只是要说清楚。 我自己并不需要一个大于64 KB的方法。 但是我写了一个编译成非常大的方法的语法。

Java8的Lambdas与匿名类

由于Java8最近刚刚发布,它的全新lambdaexpression式看起来非常酷,所以我想知道这是否意味着我们习以为常的匿名类的消亡。 我一直在研究一些这方面的知识,并且发现了一些关于Lambdaexpression式如何系统地replace这些类的很酷的例子,比如Collection的Sort方法,它用来得到一个Comparator的Anonymous实例来执行sorting: Collections.sort(personList, new Comparator<Person>(){ public int compare(Person p1, Person p2){ return p1.firstName.compareTo(p2.firstName); } }); 现在可以使用Lambdas完成: Collections.sort(personList, (Person p1, Person p2) -> p1.firstName.compareTo(p2.firstName)); 看起来令人惊讶的简洁。 所以我的问题是,有什么理由继续在Java8中使用这些类而不是Lambdas? 编辑 同样的问题,但在相反的方向,使用Lambdas而不是匿名类的好处是什么,因为Lambdas只能用于单一的方法接口,这个新function只是一个仅在less数情况下使用的快捷方式,还是真的有用吗?

你能把一个stream分成两个stream吗?

我有一个由Java 8stream表示的数据集: Stream<T> stream = …; 我可以看到如何过滤它以获得一个随机子集 – 例如 Random r = new Random(); PrimitiveIterator.OfInt coin = r.ints(0, 2).iterator(); Stream<T> heads = stream.filter((x) -> (coin.nextInt() == 0)); 我还可以看到我怎样才能减less这个数据stream,例如,得到两个表示数据集中两个随机数的列表,然后将这些数据集转换回stream。 但是,是否有一种直接的方式来从最初的一个生成两个stream? 就像是 (heads, tails) = stream.[some kind of split based on filter] 感谢您的任何见解。

为什么在HashMap.clear()中不再使用Arrays.fill()?

我注意到在HashMap.clear()的实现中有一些奇怪的东西。 这就是它在OpenJDK 7u40中的样子 : public void clear() { modCount++; Arrays.fill(table, null); size = 0; } 这就是OpenJDK 8u40的外观 : public void clear() { Node<K,V>[] tab; modCount++; if ((tab = table) != null && size > 0) { size = 0; for (int i = 0; i < tab.length; ++i) tab[i] = null; } } 我知道,现在的table可以是空的地图,因此在本地variables中的附加检查和caching是必需的。 但为什么Arrays.fill()replace为for循环? […]

在JDK中默认是Java中的多重inheritance吗?

JDK 8中提供的新function允许您添加到现有界面,同时保持二进制兼容性。 语法就像 public interface SomeInterface() { void existingInterface(); void newInterface() default SomeClass.defaultImplementation; } 这种方式对于所有现有的SomeInterface实现,当他们升级到这个新版本时,他们并不都突然在newInterface()周围编译错误。 虽然这很整齐,但是当你实现两个接口时,会发生什么事情,这两个接口都添加了一个你没有实现的新的默认方法? 让我以一个例子来解释。 public interface Attendance { boolean present() default DefaultAttendance.present; } public interface Timeline { boolean present() default DefaultTimeline.present; } public class TimeTravelingStudent implements Attendance, Timeline { } // which code gets called? new TimeTravelingStudent().present(); 这是否被定义为JDK 8的一部分呢? 我发现Java神在这里谈论类似的东西http://cs.oswego.edu/pipermail/lambda-lib/2011-February/000068.html ,但它的私人邮件列表的一部分,我不能直接问他们。 有关如何在JDK […]

如何用lambdaexpression式debuggingstream()。map(…)?

在我们的项目中,我们正在迁移到Java 8,我们正在testing它的新function。 在我的项目中,我使用Guava谓词和函数来使用Collections2.transform和Collections2.filter来过滤和转换一些集合。 在这个迁移我需要改变例如番石榴代码到Java 8的变化。 所以,我正在做的改变是这样的: List<Integer> naturals = Lists.newArrayList(1,2,3,4,5,6,7,8,9,10,11,12,13); Function <Integer, Integer> duplicate = new Function<Integer, Integer>(){ @Override public Integer apply(Integer n) { return n * 2; } }; Collection result = Collections2.transform(naturals, duplicate); 至… List<Integer> result2 = naturals.stream() .map(n -> n * 2) .collect(Collectors.toList()); 使用番石榴我非常舒适的debugging代码,因为我可以debugging每个转换过程,但我关心的是如何debugging例如.map(n -> n*2) 。 使用debugging器,我可以看到一些代码: @Hidden @DontInline /** Interpretively […]

为什么java.util.Optional不是Serializable,如何用这些字段序列化对象

Enum类是可序列化的,因此使用枚举序列化对象没有问题。 另一种情况是类有java.util.Optional类的字段。 在这种情况下,会引发以下exception:java.io.NotSerializableException:java.util.Optional 如何处理这样的类,如何序列化它们? 是否有可能发送这样的对象到远程EJB或通过RMI? 这是一个例子: import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Optional; import org.junit.Test; public class SerializationTest { static class My implements Serializable { private static final long serialVersionUID = 1L; Optional<Integer> value = Optional.empty(); public void setValue(Integer i) { this.i = Optional.of(i); } public Optional<Integer> getValue() { return value; } […]

使用Java8将对象列表转换为从toString()方法获得的string

Java8中有很多有用的新东西。 例如,我可以在一个对象列表上迭代一个stream,然后对来自Object实例的特定字段的值进行求和。 例如 public class AClass{ int value; public int getValue(){return value;} } Integer sum = list.stream().mapToInt(AClass::getValue).sum(); 因此,我争论是否有任何方法来构build一个String ,从一行中的实例连接toString()方法的输出。 List<Integer> list =… String concatenated = list.stream()…. //concatenate here with toString() method from java.lang.Integer class 假设list包含整数2和3 ,我期望concatenated是"123"或"1,2,3" 。

内置的Java 8谓词总是返回true?

谷歌Guava有一个谓词总是返回true 。 Java 8是否有类似于Predicate东西? 我知道我可以使用(foo)->{return true;} ,但是我想要一些预制的东西,类似于Collections.emptySet() 。