Java 8中的公共成员变量是特征还是实现副作用/缺陷?
这个问题与预发布的Java 8 build lambda-8-b50-linux-x64-26_jul_2012.tar.gz有关.
Java 8以默认方法的形式向接口引入了新功能.使用JDK8 lambda编译器进行临时测试允许使用以下形式的接口:
public interface Foo {
public int foo = 0;
int foo() default { return foo; }
}
Run Code Online (Sandbox Code Playgroud)
示例实现类型:
public class FooImpl implements Foo {
public int foo = 1;
}
Run Code Online (Sandbox Code Playgroud)
此代码遵循变量阴影的标准约定:
Foo f = new FooImpl();
System.out.println(f.foo());
System.out.println(f.foo);
System.out.println(new FooImpl().foo);
Run Code Online (Sandbox Code Playgroud)
输出:
0
0
1
Run Code Online (Sandbox Code Playgroud)
文档(JSR 335:用于Java™编程语言版本0.5.1的Lambda表达式)未提及成员变量.我倾向于认为编译器过于宽容,但也许我错过了一些东西.
我正在尝试使用Gradle 1.6构建Java 8项目,但我坚持这个错误:
Execution failed for task ':ejb:compileJava'
invalid target release: 1.8
Run Code Online (Sandbox Code Playgroud)
JAVA_HOME设置为"D:\ Program Files\Java\jdk1.8.0",build.gradle包含以下行:
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
Run Code Online (Sandbox Code Playgroud) 最初我使用下划线_作为类名.新的Java8编译器抱怨它" 在Java SE 8之后可能不受支持 ".我改变了$,并且没有任何警告.但是我记得$Java用它来表示字节代码中的内部/嵌入类.我想知道使用美元符号$作为班级名称是否存在任何风险
这个问题的一些背景知识.我想要做的是克服Java不支持纯函数的事实,而_或$是用命名空间来封装一些非常通用的概念(类/静态方法).我也没有一个好名字,也不希望lib用户输入太多东西来引用该命名空间.以下代码显示了我正在做的事情:https://github.com/greenlaw110/java-tool/blob/master/src/main/java/org/osgl/_.java
根据StackOverflow-On Topic,这是一个特定的编程问题,一个软件算法,关于程序员常用的软件工具,它是一个实用的,可回答的问题,是软件开发所特有的.
...
我试图确定List在即将发布的Java 8中使用新的lambdas功能更改所有值的正确方法,而无需创建**new** List.
这适用于List调用者传入a并需要应用函数将所有内容更改为新值的时间.例如,该方式Collections.sort(list)就地更改列表.
给这个转换函数和这个起始列表最简单的方法是将函数应用于原始列表中的所有值而不创建新列表?
String function(String s){
return s.toUppercase(); // or something else more complex
}
List<String> list = Arrays.asList("Bob", "Steve", "Jim", "Arbby");
Run Code Online (Sandbox Code Playgroud)
将更改应用于所有值的常用方法是:
for (int i = 0; i < list.size(); i++) {
list.set(i, function( list.get(i) );
}
Run Code Online (Sandbox Code Playgroud)
lambdas和Java 8是否提供:
for(..)循环的所有脚手架?我在OSX 10.9.2上使用Java 8 build 1.8.0-b132.
我正在使用Nashorn在Java 8中使用新的JavaScript运行时.
我正在使用Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/bin/jjs但不幸的jjs是在交互模式下几乎无法使用,因为光标左/右不起作用:
jjs
jjs> var x = ^ [[D.
上面的输出(^ [[D]是按'左'的结果'.有没有办法解决这种行为并在jjs控制台中左/右使用光标?
我正在使用lambda为内部类构造函数创建供应商ctx -> new SpectatorSwitcher(ctx).IntelliJ建议我将其SpectatorSwitcher::new改为.SpectatorSwitcher是我正在使用的类的非静态内部类.建议的代码编译得很好(使用maven)但我在执行时得到以下VerifyError:
Exception in thread "main" java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
Test.lambda$runTest$8(LTest$Worker;)V @2: invokedynamic
Reason:
Type 'Test$Worker' (current frame, stack[1]) is not assignable to 'Test'
Current Frame:
bci: @2
flags: { }
locals: { 'Test$Worker' }
stack: { 'Test$Worker', 'Test$Worker' }
Bytecode:
0000000: 2a2a ba00 0b00 00b6 000c b1
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2688)
at java.lang.Class.getMethod0(Class.java:2937)
at java.lang.Class.getMethod(Class.java:1771)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Run Code Online (Sandbox Code Playgroud)
为什么javac/maven在编译时没有失败但仍然产生无效的字节代码?
编辑:问题似乎比简单调用复杂得多,这是重现它所需的代码:
import java.util.function.Function;
/**
* @author …Run Code Online (Sandbox Code Playgroud) 我遇到一个奇怪的问题,方法引用Thread::sleep是模糊的,但具有相同签名的方法不是.
package test;
public class Test
{
public static void main(String[] args)
{
foo(Test::sleep, 1000L); //fine
foo((FooVoid<Long>)Thread::sleep, 1000L); //fine
foo(Thread::sleep, 1000L); //error
}
public static void sleep(long millis) throws InterruptedException
{
Thread.sleep(millis);
}
public static <P, R> void foo(Foo<P, R> function, P param) {}
public static <P> void foo(FooVoid<P> function, P param) {}
@FunctionalInterface
public interface Foo<P, R> {
R call(P param1) throws Exception;
}
@FunctionalInterface
public interface FooVoid<P> {
void call(P param1) throws Exception;
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了这两个错误: …
我的目标是过滤最佳匹配.在我的例子中,我有一个人员列表,我想按姓氏和名字过滤.
匹配的优势将是:
我的代码到目前为止:
final List<Person> persons = Arrays.asList(
new Person("Doe", "John"),
new Person("Doe", "Jane"),
new Person("Munster", "Herman");
Person person = persons.stream().filter(p -> p.getSurname().equals("Doe")).???
Run Code Online (Sandbox Code Playgroud) 我有一个包含以下元素的数组列表:
List<Record> list = new ArrayList<>();
list.add(new Record(3, "32"));
list.add(new Record(4, "42"));
list.add(new Record(1, "12"));
list.add(new Record(1, "11"));
list.add(new Record(2, "22"));
list.add(new Record(5, "52"));
list.add(new Record(5, "53"));
list.add(new Record(5, "51"));
Run Code Online (Sandbox Code Playgroud)
Record是一个简单的POJO,它有id和name
我想在列表中做那些.
创建一个像Map<Integer, List<Record>>这样的地图有一个密钥是id和更细的密钥添加为列表.我已经做了如下.
Map<Integer, List<Record>> map = list.stream()
.collect(Collectors.groupingBy(Record::getId, HashMap::new, Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)现在我想按名称和子列表对列表进行排序,以提供内部限制
map.forEach((k, v) -> v.stream().sorted(Comparator.comparing(Record::getName)));
map.forEach((k, v) -> map.put(k, v.subList(0, Math.min(**limit**, v.size()))));
Run Code Online (Sandbox Code Playgroud)我已经尝试过,看起来这不是一个好方法.有谁能建议更好的方法?
我有一个Foo对象流.
class Foo {
private int variableCount;
public Foo(int vars) {
this.variableCount = vars;
}
public Integer getVariableCount() {
return variableCount;
}
}
Run Code Online (Sandbox Code Playgroud)
我想要一个列表,Foo它们都具有最低的variableCount.
例如
new Foo(3), new Foo(3), new Foo(2), new Foo(1), new Foo(1)
Run Code Online (Sandbox Code Playgroud)
我只希望流返回最后2 Foo秒
我试过用分组进行收集
.collect(Collectors.groupingBy((Foo foo) -> {
return foo.getVariableCount();
})
Run Code Online (Sandbox Code Playgroud)
这会返回一个Map<Integer, List<Foo>>,我不知道如何将其转换为我想要的.
提前致谢
java-8 ×10
java ×9
lambda ×3
java-stream ×2
algorithm ×1
collections ×1
gradle ×1
javac ×1
nashorn ×1