Tag: java 8

你可以从子接口那个接口的接口调用父接口的默认方法吗?

在java 8中我有这样的东西: package test; public class SimpleFuncInterfaceTest { public static void carryOutWork(AFunctionalInterface sfi){ sfi.doWork(); } public static void main(String[] args) { carryOutWork(() -> System.out.println(“Do work in lambda exp impl…”)); AImplementor implementsA = new AImplementor(); //carryOutWork(() -> implementsA.doWork()); BImplementor implementsB = new BImplementor(); carryOutWork(() -> implementsB.doWork()); } } @FunctionalInterface interface AFunctionalInterface { public void doWork(); default […]

为什么@FunctionalInterface不能在JDK中符合条件的所有接口上使用?

Java 8为我们提供了许多有趣的方法来使用function接口,并为它们提供了一个新的注释: @FunctionalInterface 。 如果我们不遵守function接口的规则(只需要一个需要覆盖的抽象方法),它的工作就是告诉编译器对我们大喊大叫。 java.util.function包中有43个接口,带有此批注。 搜索@FunctionalInterface的jdk.1.8.0 / src只能获得57次点击。 为什么可能添加@FunctionalInterface的其他接口(如AutoCloseable)仍然缺少它? 注释文档中有一些模糊的提示: “用于指示接口类型声明旨在成为function接口的信息性注释类型” 有没有什么好的理由不打算我设计的接口(可能只是一个function接口)不能用作一个接口? 除了没有意识到它可能被添加之外,是否有任何迹象? 是不是将抽象方法添加到任何已发布的接口来阻止实现它的任何人,function与否? 我觉得玩世不恭,假设他们只是懒得去追捕他们,但其他解释是什么? 更新 :在查看“应该’可比’是’function界面’后?” 我发现我仍然有唠叨的问题。 当单一方法接口和function接口在结构上相同时,它们会有什么不同? 简单的名称是不同的? Comparable和Comparator在语义上足够接近。 事实certificate它们在结构上是不同的,但仍然不是最好的例子…… 是否有一种情况,SMI在结构上很好用作function接口,但仍然不鼓励接口名称和方法的语义含义? 或者也许是Javadocs隐含的合同?

无法反序列化lambda

就像一个小项目一样,我一直试图做一个小东西,读取序列化的lambdas(本地或从FTP)并调用它们的运行函数作为测试的一部分来试验Windows中的文件关联(即打开某些文件类型)用某个程序打开它们等等,但无论我尝试什么,它似乎都没有正确地反序列化。 lambda被宣布为这样 Runnable r = (Runnable & Serializable) () -> { // blah blah // made sure not to capture anything }; 并使用由ObjectOutputStream包装的[n optional] BufferedOutputStream包装的FileOutputStream进行序列化,没有问题。 但是,当[在不同的项目中]反序列化时,它会失败,说它无法找到包含序列化代码的封闭类。 我已经尝试了各种各样的东西,比如将它们包装在一个可序列化的类中(用于测试目的的w / serialVersionUID = 0L)或定义一个扩展Runnable和Serializable的接口,但无济于事。 是的,我知道序列化lambda不是很好的做法(或者我们被告知),但我不知道如何将函数和子程序转换成我可以存储为文件或FTP的东西。 如果这根本不是正确的方法,请告诉我们。 哦,我正在使用最新版本的Eclipse Luna。 编辑: 像这样反序列化 File f = new File(somePath); FileInputStream fish = new FileInputStream(f); BufferedInputStream bos = new BufferedInputStream(fish); // not really […]

使用自定义收集器进行Java 8分组?

我有以下课程。 class Person { String name; LocalDate birthday; Sex gender; String emailAddress; public int getAge() { return birthday.until(IsoChronology.INSTANCE.dateNow()).getYears(); } public String getName() { return name; } } 我希望能够按年龄分组,然后收集人名列表而不是Person对象本身; 所有这些都在一个很好的lamba表达式中。 为了简化所有这些,我将链接我当前的解决方案,该解决方案按年龄存储分组结果,然后迭代它以收集名称。 ArrayList members = new ArrayList(); members.add(new OtherPerson(“Fred”, IsoChronology.INSTANCE.date(1980, 6, 20), OtherPerson.Sex.MALE, “fred@example.com”)); members.add(new OtherPerson(“Jane”, IsoChronology.INSTANCE.date(1990, 7, 15), OtherPerson.Sex.FEMALE, “jane@example.com”)); members.add(new OtherPerson(“Mark”, IsoChronology.INSTANCE.date(1990, 7, 15), OtherPerson.Sex.MALE, […]

Java8 Collections.sort(有时)不会对JPA返回的列表进行排序

Java8在我的JPA EclipseLink 2.5.2环境中继续做一些奇怪的事情。 我不得不删除问题https://stackoverflow.com/questions/26806183/java-8-sorting-behaviour昨天,因为在这种情况下的排序受到奇怪的JPA行为的影响 – 我通过强制执行该方法找到了解决方法在进行最终排序之前的第一个排序步骤。 仍然在Java 8中使用JPA Eclipselink 2.5.2,以下代码有时不在我的环境中排序(Linux,MacOSX,都使用build 1.8.0_25-b17)。 它在JDK 1.7环境中按预期工作。 public List getDocumentsByModificationDate() { List docs=this.getDocuments(); LOGGER.log(Level.INFO,”sorting “+docs.size()+” by modification date”); Comparator comparator=new ByModificationComparator(); Collections.sort(docs,comparator); return docs; } 从JUnit测试调用时,上述函数正常工作。 在生产环境中进行debbuging时,我会得到一个日志条目: INFORMATION: sorting 34 by modification date 但在TimSort中,nRemaining <2的返回语句被命中 – 因此不会发生排序。 JPA提供的IndirectList(请参阅jpa返回的集合? )被认为是空的。 static void sort(T[] a, int lo, int hi, Comparator c, […]

Java 8 lambdas组列表进入映射

我想获取List并return Map<String, List> ,其中Map的键是Pojo的String值,我们称之为String key 。 澄清一下,给出以下内容: Pojo 1:Key:值:1 Pojo 2:Key:值:2 Pojo 3:键:b值:3 Pojo 4:键:b值:4 我想要一个Map<String, List> with keySet() size 2,其中键“a”具有Pojos 1和2,键“b”具有pojos 3和4。 我怎么能用Java 8 lambdas最好地实现这个目标?

Java 8:对的引用不明确

有没有人理解为什么以下代码可以在Java 7及更低版本中正常编译,但是在Java 8中失败了。 public static void main(String[] args) throws Exception { put(get(“hello”)); } public static R get(String d) { return (R)d; } public static void put(Object o) { System.err.println(“Object ” + o); } public static void put(CharSequence c) { System.err.println(“CharSequence ” + c); } public static void put(char[] c) { System.err.println(“char[] ” + c); } […]

Reader#lines()由于其spliterator中的不可配置的批量大小策略而严重并行化

当流源是Reader时,我无法实现流处理的良好并行化。 在四核CPU上运行下面的代码我首先观察到3个核心,然后突然下降到两个核心,然后是一个核心。 整体CPU利用率徘徊在50%左右。 请注意示例的以下特征: 只有6,000行; 每条线需要大约20毫秒来处理; 整个过程大约需要一分钟。 这意味着所有压力都在CPU上,I / O很小。 这个例子是一个用于自动并行化的坐鸭。 import static java.util.concurrent.TimeUnit.NANOSECONDS; import static java.util.concurrent.TimeUnit.SECONDS; … class imports elided … public class Main { static final AtomicLong totalTime = new AtomicLong(); public static void main(String[] args) throws IOException { final long start = System.nanoTime(); final Path inputPath = createInput(); System.out.println(“Start processing”); try (PrintWriter […]

为什么Java-8中的接口允许使用main方法?

为什么接口允许在Java 8使用main方法? 如下面的代码所述,它工作正常并正确产生输出。 public interface Temp { public static void main(String args[]){ System.out.println(“Hello”); } } 输出 ( 运行Temp.java后 ) Hello 那么interface主方法和class什么区别? 目前它表现得像一个类, 我已经用main方法执行了interface 。 我们为什么需要这个? 编辑 从下面的评论中添加更多现有问题 (作者Brian Goetz) 我们是否应该明确禁止使用main方法,因为interfaces中允许使用static方法(或者,等效地,将’interface classes’排除为java启动程序的目标。)

思考 – Java 8 – 无效的常量类型

我有一个Reflections库的问题。 我试图动态加载实现特定接口的所有类。 只要我不在这些类中使用lambda表达式(java 8),一切正常(所有类都被加载)。 我试过升级lib版本,但效果是一样的(java.io.IOException:无效的常量类型:18)。 依赖并在pom.xml中构建 org.reflections reflections 0.9.10 javassist javassist org.javassist javassist 3.19.0-GA org.apache.maven.plugins maven-compiler-plugin 1.8 1.8 没有排除是相同的效果。 码: URL jarUrl = jarFile.toURI().toURL(); URLClassLoader child = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader()); ConfigurationBuilder builder = new ConfigurationBuilder() .addClassLoader(child) .addUrls(jarUrl) .setScanners(new SubTypesScanner()); Reflections r = new Reflections(builder); return r.getSubTypesOf(cls); 如何使用lambda表达式加载类? PS抱歉英语:)