标签: java-8

Lambda的行为与匿名内部类不同

在做一些基本的lambda练习时,一个看似相同的匿名内部类的输出给了我一个不同于lambda的输出.

interface Supplier<T> {

    T get(T t);
}
Run Code Online (Sandbox Code Playgroud)

场景#1

Supplier<Integer> s1 = new Supplier<Integer>() {
    @Override
    public Integer get(Integer t) {
        return t;
    }
};
Supplier<Integer> s2 = t -> t;
System.out.println(s1.get(2));
System.out.println(s2.get(2));
Run Code Online (Sandbox Code Playgroud)

输出22.这里没什么新鲜的.


但是当我这样做时:

场景#2

Supplier<Integer> s1 = new Supplier<Integer>() {
    @Override
    public Integer get(Integer t) {
        return t++;
    }
};
Supplier<Integer> s2 = t -> t++;
System.out.println(s1.get(2));
System.out.println(s2.get(2));
Run Code Online (Sandbox Code Playgroud)

输出23

问题:两个输出不应该相同吗?我错过了什么吗?


为了完整起见: 场景#3

Supplier<Integer> s1 = new Supplier<Integer>() {
    @Override
    public Integer …
Run Code Online (Sandbox Code Playgroud)

java lambda anonymous-inner-class java-8

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

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万
查看次数

从Java 8映射操作返回空元素

使用Java 8流,当输入Integer没有输出时,映射a 的最佳方法是什么List<Integer>

只需返回null?但现在我的输出列表大小将小于我的输入大小...

    List<Integer> input = Arrays.asList(0,1,2,3);
    List<Integer> output = input.stream()
                                .map(i -> { 
                                    Integer out = crazyFunction(i);
                                    if(out == null || out.equals(0))
                                        return null;
                                    return Optional.of(out);
                                    })
                                .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

java map java-8 java-stream

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

用于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万
查看次数

Java停止了内部类中非final变量的错误(java 8)

Java 7在下面的代码中说"不能引用封闭范围中定义的非最终局部变量消息":

public class Runner {   
    public static void main(String[] args) {

        String message = "Hello world";

        new Runnable() {
            @Override
            public void run() {
                System.out.println(message);
            }
        }.run();
    }
}
Run Code Online (Sandbox Code Playgroud)

Java 8没有.

怀疑这是关于向Java添加函数编程功能.

它是否同样处理代码?

java inner-classes java-8

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

转换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
查看次数

JAXB可以处理java.time对象吗?

我知道JAXB(用于XML绑定的Java体系结构)可以编组/解组java.util.Date对象,如Blaise Doughan的回答所示.

但有关新东西java.time包中的对象的Java 8,如ZonedDateTime?JAXB是否已更新以处理这种新的内置数据类型?

java xml jaxb java-8 java-time

24
推荐指数
1
解决办法
8118
查看次数

使用java 8 api打印列表项

我可以使用类似的东西:

 .forEach(System.out::print)
Run Code Online (Sandbox Code Playgroud)

打印我的列表项,但如果我在打印前有其他操作要做,我不能使用它:

mylist.replaceAll(s -> s.toUpperCase()).forEach(System.out::print)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:无法取消引用void

java java-8

24
推荐指数
2
解决办法
4万
查看次数

我应该设置MaxMetaspaceSize吗?

因此,在提出这个问题之后,很快就发现重要的问题不是"我怎么能",而是"我应该"吗?

我们的客户正在从Java7迁移到Java8(使用Tomcat7).Java7需要设置-XX:MaxPermSize,并且由于个人需求和使用,一些客户已将其最大值增加到安装程序设置的默认值以上.

我应该设置-XX:MaxMetaspaceSize(以前的-XX:MaxPermSize设置)谁定义了一个自定义的最大客户?新安装怎么样?我们应该设置-XX:MaxMetaspaceSize吗?

这样的决定有哪些利弊?

tomcat memory-management java-8

24
推荐指数
2
解决办法
4万
查看次数