在做一些基本的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)
输出2和2.这里没什么新鲜的.
但是当我这样做时:
场景#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)
输出2和3
问题:两个输出不应该相同吗?我错过了什么吗?
为了完整起见: 场景#3
Supplier<Integer> s1 = new Supplier<Integer>() {
@Override
public Integer …Run Code Online (Sandbox Code Playgroud) 如果我将一个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 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) 有没有办法创建IntStream一系列的整数?
就像我想要将值1到1000流,我可以调用一些IntStream静态工厂来传输该范围?
IntStream.forRange(1, 1000).forEach(//do something...
Run Code Online (Sandbox Code Playgroud) 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添加函数编程功能.
它是否同样处理代码?
一如既往,我正在查看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)找到这段代码.
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表示没有返回值的方法
我知道JAXB(用于XML绑定的Java体系结构)可以编组/解组java.util.Date对象,如Blaise Doughan的回答所示.
但有关新东西java.time包中的对象的Java 8,如ZonedDateTime?JAXB是否已更新以处理这种新的内置数据类型?
我可以使用类似的东西:
.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
因此,在提出这个问题之后,很快就发现重要的问题不是"我怎么能",而是"我应该"吗?
我们的客户正在从Java7迁移到Java8(使用Tomcat7).Java7需要设置-XX:MaxPermSize,并且由于个人需求和使用,一些客户已将其最大值增加到安装程序设置的默认值以上.
我应该设置-XX:MaxMetaspaceSize(以前的-XX:MaxPermSize设置)谁定义了一个自定义的最大客户?新安装怎么样?我们应该设置-XX:MaxMetaspaceSize吗?
这样的决定有哪些利弊?