Tag: java 8

Spring + AspectJ使用aspectj-maven-plugin编织java 8

我正在将我的项目从java 7迁移到java 8,我遇到的问题与使用aspectj-maven-plugin aspectj编织有关。 根据Haus文档,我可以使用在Java 6和7上运行的这个插件成功配置编织。 但问题是我还没有找到任何方法来使用(并找到)支持java 8的插件版本7.我在这里看到插件7增加了java 8支持,但找不到使用它的方法。 这是我需要的配置插件: org.codehaus.mojo aspectj-maven-plugin 1.7 1.8 1.8 1.8 compile test-compile 我确认使用版本1.6的上述代码适用于Java 7,但尝试使用1.7版本没有运气。 你知道怎么运行在Java 8上运行的spring + aspectj的weaver吗?

HashMap调整方法实现细节

正如标题所示,这是一个关于HashMap#resize的实现细节的问题 – 当内部数组的大小加倍时。 这有点罗嗦,但我真的试图certificate我对此有了最好的理解…… 这发生在此特定桶/箱中的条目以Linked方式存储的时刻 – 因此具有确切的顺序并且在问题的上下文中这是重要的 。 一般来说, resize也可以从其他地方调用,但让我们只看一下这种情况。 假设您将这些字符串作为键放在HashMap (右侧是HashMap hashcode 之后的 HashMap#hash – 这是内部重新散列。)是的,这些都是精心生成的,而不是随机的。 DFHXR – 11111 YSXFJ – 01111 TUDDY – 11111 AXVUH – 01111 RUTWZ – 11111 DEDUC – 01111 WFCVW – 11111 ZETCU – 01111 GCVUR – 11111 这里有一个简单的模式 – 最后4位对于所有这些都是相同的 – 这意味着当我们插入这些键中的8个(总共9个)时,它们最终会在同一个桶中; 在第9个HashMap#put ,将调用resize 。 因此,如果当前在HashMap有8个条目(具有上面的一个键) – 这意味着在该映射中有16个桶,并且它们的最后4个位决定了条目最终的位置。 […]

ClassCast错误:Java 7与Java 8

这是一个错误或function吗? 以下代码在Java 7中运行良好,但在Java 8中引发exception: 最后一个命令在Java8中抛出ClassCastexception,上面的所有“等效”命令的工作方式相同。 我认为问题在于,在Java 8中,编译器决定在最后一行使用String.value(char[])而不是Java 7中的String.value(Object) 。我认为这应该表现相同向后兼容的方式。 我错过了什么吗? 注意:正如Marko所说,这可能与Java 8中引入的目标类型推断有关。 public class Test { public static void main(String[] args) { System.out.println( getVal().getClass()); // String System.out.println( String.valueOf(Test.getVal()) ); // “abc” Object obj = getVal(); System.out.println( String.valueOf(obj) ); // “abc” System.out.println( String.valueOf(getVal()) ); // 7: “abc”, 8: Exception } // returns a string for simplicity; […]

如何将TimerTask与lambdas一起使用?

正如您所知,您可以在Java 8中使用lambdas,例如替换匿名方法。 这里可以看到Java 7与Java 8的一个例子: Runnable runnable = new Runnable() { @Override public void run() { checkDirectory(); } }; 在Java 8中可以表示为以下两种方式: Runnable runnable = () -> checkDirectory(); 要么 Runnable runnable = this::checkDirectory; 这是因为Runnable是一个function接口,只有一个(抽象)公共非默认方法。 但是……对于TimerTask我们有以下内容: TimerTask timerTask = new TimerTask() { @Override public void run() { checkDirectory(); } }; 看起来很熟悉吧? 但是使用lambda表达式不起作用,因为TimerTask是一个抽象类,即使它只有一个抽象的公共非默认方法,它也不是一个接口,因此也没有function接口。 它也没有重构为具有默认实现的接口,因为它带有状态,因此无法完成。 所以我的问题 :在构造TimerTask时有没有办法使用lambdas? 我想要的是以下内容: Timer […]

在java-8中解组xml时出错“安全处理org.xml.sax.SAXNotRecognizedException导致java.lang.IllegalStateException”

以下代码在Java 7中运行良好 import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; String xmlString = ‘<xml ….. '; StringReader reader = new StringReader(xmlString); JAXBContext jc = JAXBContext.newInstance(MyClass.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); MyClass myClass = (MyClass) unmarshaller.unmarshal(reader); …. 现在我们不得不升级到Java 8,现在我在执行代码时遇到了这个exception: Sep 03, 2014 1:42:47 PM com.sun.xml.internal.bind.v2.util.XmlFactory createParserFactory SCHWERWIEGEND: null org.xml.sax.SAXNotRecognizedException: Feature: http://javax.xml.XMLConstants/feature/secure-processing at org.apache.xerces.jaxp.SAXParserFactoryImpl.setFeature(SAXParserFactoryImpl.java:100) at com.sun.xml.internal.bind.v2.util.XmlFactory.createParserFactory(XmlFactory.java:114) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.getXMLReader(UnmarshallerImpl.java:139) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157) […]

什么是Java 8 Lambda表达式编译?

请考虑以下Java 8代码段。 public static void main(String[] args) { List integers = Arrays.asList(1, 2, 3, 4, 5); Consumer consumer = x -> System.out.print(x); integers.forEach(consumer); } 什么是Consumer consumer = x -> System.out.print(x)被编译到? 我知道Lambdas不是作为匿名内部类实现的。 但是Consumer是一个接口,因此x -> System.out.print(x)必须生成某种对象,但不清楚生成什么类型​​的对象。 Java 8中是否有一些新类型的对象代表lambda表达式? 更新这里是程序与eclipse java 8编译器一起编译的反编译程序,下面的输出是在打开类文件时来自eclipse。 看起来lambda表达式变成了包含lambda表达式的类的静态方法private static synthetic void lambda$0(java.lang.Integer x); // Compiled from Example.java (version 1.8 : 52.0, super bit) […]

是否不鼓励在Java EE容器中使用Java 8并行流?

鉴于不鼓励在Java EE容器中生成线程 。 在Java EE中使用Java 8并行流可能会产生线程吗?

通过鉴别器function对流进行分区

Streams API中缺少的function之一是“分区依据”转换,例如Clojure中定义的。 假设我想重现Hibernate的fetch join :我想发出一个SQL SELECT语句来从结果中接收这种对象: class Family { String surname; List members; } 我发出: SELECT f.name, m.name FROM Family f JOIN Member m on m.family_id = f.id ORDER BY f.name 我检索(f.name, m.name)记录的(f.name, m.name) 。 现在我需要将它转换为Family对象流,并在其中包含其成员列表。 假设我已经有一个Stream ; 现在我需要将其转换为Stream<List> ,然后使用映射转换对其进行操作,将其转换为Stream 。 转换的语义如下:只要提供的鉴别器函数保持返回相同的值,就继续将流收集到List中; 一旦值更改,将List作为输出流的元素发出并开始收集新的List 。 我希望能够编写这种代码(我已经有了resultStream方法): Stream dbStream = resultStream(queryBuilder.createQuery( “SELECT f.name, m.name” + ” FROM […]

Java 8 Lambda语法更改

我遇到了一个问题,其中Lambda的允许语法在java编译器的1.8.0_05和1.8.0_20(beta)版本之间发生了变化。 例: package scratch; import javafx.scene.control.MenuItem; public class Test { public void test() { MenuItem mi = new MenuItem(); //This compiles anywhere mi.setOnAction(e -> System.out.println(“hi”)); //as does this mi.setOnAction(e -> {System.out.println(“hi”);}); //This doesn’t on build 1.8.0_20-ea-b13 – but does on build 1.8.0_05-b13 mi.setOnAction(e -> (System.out.println(“hi”))); } } 我想知道的是 – 最后一个例子是有效的Lambda表达式吗? 他们刚刚收紧了编译器validation? 或者最新的1.8编译器中是否有错误? 最新编译器打印的错误是: /scratch/src/scratch/Test.java:18: error: […]

来自HashSet的并行流不会并行运行

我有要并行处理的元素集合。 当我使用List ,并行性有效。 但是,当我使用Set ,它不会并行运行。 我写了一个显示问题的代码示例: public static void main(String[] args) { ParallelTest test = new ParallelTest(); List list = Arrays.asList(1,2); Set set = new HashSet(list); ForkJoinPool forkJoinPool = new ForkJoinPool(4); System.out.println(“set print”); try { forkJoinPool.submit(() -> set.parallelStream().forEach(test::print) ).get(); } catch (Exception e) { return; } System.out.println(“\n\nlist print”); try { forkJoinPool.submit(() -> list.parallelStream().forEach(test::print) ).get(); } […]