标签: java-8

Java 7和Java 8可以在OSX上共存

我已经安装了Java 8用于开发目的,但现在我想再次使用Java 7.

我该怎么做呢?

这似乎非常困难.

提前谢谢了.(我尝试使用guigarage,但这不起作用)

java macos java-8

25
推荐指数
3
解决办法
2万
查看次数

REST服务中的Java 8 Lambda表达式无法正常工作

如果我将一个Java 8 Lambda表达式放在REST服务中,它就会崩溃.如果我删除lambda表达式,它的工作原理.如果我使用lambda表达式并不重要.只是存在lambda足以崩溃.Java 8相关的所有其他内容似乎都有效.

以下是我的代码(简化):

@Path("finance")
public class FinanceRest {

    @GET
    @Produces("text/plain")
    public String speak() {
        return "Hello world.";
    }

    private void lambdaFunction(Predicate<Account> predicate) {
        // Any lambda will cause problems, no matter how simple
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        Stream<Integer> onlyOdds = numbers.stream().filter(n -> n%2 != 0);
    }

}
Run Code Online (Sandbox Code Playgroud)

从上面的代码中可以看出,只有lambda表达式的存在才会导致失败.一旦我删除lambda,它工作正常.其他Java 8的东西很好(例如,"Predicate"输入参数).

我得到的错误消息是: java.lang.ArrayIndexOutOfBoundsException:25980

我已经在使用Java 8的Tomcat 7和8上尝试了这个.我正在使用来自JavaEE 6的标准jax-rs ...换句话说我的POM文件有:

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.谢谢.

确切的错误消息(在Glassfish 4.0上......我尝试过Tomcat和Glassfish)是:

java.lang.ArrayIndexOutOfBoundsException:52264 at org.objectweb.asm.ClassReader.readClass(ClassReader.java:2015)atg.objectweb.asm.ClassReader.accept(ClassReader.java:469)at org.objectweb.asm.ClassReader.接受(ClassReader.java:425)org.glassfish.hk2.classmodel.reflect.Parser $ …

java lambda glassfish java-8 glassfish-4

25
推荐指数
3
解决办法
1万
查看次数

JDK 8 update 20中是否存在类型推断回归?

我有以下代码的问题:

public static <T> T firstNonNull(@Nullable T first, @Nullable T second) {
    return first != null ? first : second;
}

public static Set<String> getStrings() {
   return new HashSet<>();
}

public static Set<String> doesNotCompile = firstNonNull(getStrings(), new HashSet<>());
Run Code Online (Sandbox Code Playgroud)

使用JDK 8直到更新11,此代码编译.使用JDK 8 update 20,它不再编译.在最后一个语句中,我必须显式指定String最后一个HashSet实例化的类型参数.

我想知道这个代码是否错误,或者它是否是最后一次JDK更新中的回归.

java java-8

25
推荐指数
1
解决办法
817
查看次数

在Java语法中::的含义

以下代码中::的含义是什么?

Set<String> set = people.stream()
                        .map(Person::getName)
                        .collect(Collectors.toCollection(TreeSet::new));
Run Code Online (Sandbox Code Playgroud)

java syntax java-8

25
推荐指数
3
解决办法
2万
查看次数

调用局部变量的Java 8方法引用

我正在学习Java 8,我遇到了一些我觉得有点奇怪的东西.

请考虑以下代码段:

private MyDaoClass myDao;

public void storeRelationships(Set<Relationship<ClassA, ClassB>> relationships) {
    RelationshipTransformer transformer = new RelationshipTransformerImpl();

    myDao.createRelationships(
            relationships.stream()
            .map((input) -> transformer.transformRelationship(input))
            .collect(Collectors.toSet())
    );
}
Run Code Online (Sandbox Code Playgroud)

基本上,我需要将调用的输入集映射relationships到不同的类型,以符合我正在使用的DAO的API.对于转换,我想使用RelationshipTransformerImpl我实例化为局部变量的现有类.

现在,这是我的问题:

如果我要修改上面的代码如下:

public void storeRelationships(Set<Relationship<ClassA, ClassB>> relationships) {
    RelationshipTransformer transformer = new RelationshipTransformerImpl();

    myDao.createRelationships(
            relationships.stream()
            .map((input) -> transformer.transformRelationship(input))
            .collect(Collectors.toSet())
    );

    transformer = null;  //setting the value of an effectively final variable
}
Run Code Online (Sandbox Code Playgroud)

我显然会得到一个编译错误,因为局部变量transformer不再是"有效的最终".但是,如果用方法引用替换lambda:

public void storeRelationships(Set<Relationship<ClassA, ClassB>> relationships) {
    RelationshipTransformer transformer = new RelationshipTransformerImpl();

    myDao.createRelationships(
            relationships.stream()
            .map(transformer::transformRelationship)
            .collect(Collectors.toSet()) …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 method-reference

25
推荐指数
3
解决办法
1539
查看次数

用于int范围的Java 8 IntStream?

有没有办法创建IntStream一系列的整数?

就像我想要将值1到1000流,我可以调用一些IntStream静态工厂来传输该范围?

IntStream.forRange(1, 1000).forEach(//do something...
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

25
推荐指数
1
解决办法
2万
查看次数

如何强制max()返回Java Stream中的所有最大值?

我已经测试了Java 8 lambdas和stream上的max()函数,看起来如果执行max(),即使多个对象比较为0,它也会返回绑定候选者中的任意元素进一步考虑.

对于这样的最大预期行为是否有明显的技巧或功能,以便返回所有最大值?我没有在API中看到任何内容,但我确信它必须存在比手动比较更好的东西.

例如:

//myComparator is an IntegerComparator
Stream.of(1,3,5,3,2,3,5).max(myComparator).forEach(System.out::println);
//Would print 5,5 in any order.
Run Code Online (Sandbox Code Playgroud)

java collections lambda java-8 java-stream

25
推荐指数
3
解决办法
1万
查看次数

流分组:减少到列表的第一个元素

我有一个List<Valuta>可以表示(简化)JSON风格:

[{codice = EUR,description = Euro,ratio = 1},{codice = USD,description = Dollars,ratio = 1.1}]

我想用这样的方式改变它Map<String, Valuta>:

{EUR = {codice = EUR,description = Euro,ratio = 1},USD = {codice = USD,description = Dollars,ratio = 1.1}}

我写了这个单行:

getValute().stream().collect(Collectors.groupingBy(Valuta::getCodice));
Run Code Online (Sandbox Code Playgroud)

但这会返回一个Map<String, List<Valuta>>而不是我需要的东西.

我认为mapping()功能对我有用,但不知道如何.

java grouping java-8 java-stream collectors

25
推荐指数
4
解决办法
1万
查看次数

转换Java功能接口

一如既往,我正在查看JDK 8源代码并发现非常有趣的代码:

@Override
default void forEachRemaining(Consumer<? super Integer> action) {
    if (action instanceof IntConsumer) {
        forEachRemaining((IntConsumer) action);
    } 
}
Run Code Online (Sandbox Code Playgroud)

问题是:怎么Consumer<? super Integer>可能是一个实例 IntConsumer?因为他们处于不同的等级.

我已经制作了类似的代码片段来测试:

public class InterfaceExample {
    public static void main(String[] args) {
        IntConsumer intConsumer = i -> { };
        Consumer<Integer> a = (Consumer<Integer>) intConsumer;

        a.accept(123);
    }
}
Run Code Online (Sandbox Code Playgroud)

但它抛出ClassCastException:

Exception in thread "main" 
    java.lang.ClassCastException: 
       com.example.InterfaceExample$$Lambda$1/764977973 
     cannot be cast to 
       java.util.function.Consumer
Run Code Online (Sandbox Code Playgroud)

你可以在java.util.Spliterator.OfInt#forEachRemaining(java.util.function.Consumer)找到这段代码.

java lambda classcastexception java-8 functional-interface

25
推荐指数
3
解决办法
4182
查看次数

为什么以下使用方法引用的转换不会产生编译错误?

public class SomeClass{

    public static int someFunction(int a) {
        return a;
    }

    public static void main(String[] args) {    
        Consumer<Integer> c = SomeClass::someFunction; 
    }
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么:Consumer<Integer> c = SomeClass::someFunction; 不产生编译错误,因为函数someFunction是一个带返回值的方法,而Consumer表示没有返回值的方法

java java-8

25
推荐指数
2
解决办法
1193
查看次数