我有一个像这样的Java-8-FunctionalInterface:
@FunctionalInterface
public interface A {
void doIt ();
}
Run Code Online (Sandbox Code Playgroud)
该Function-Interface提供的compose-方法.我想用它来减少这样的流A:
Stream<A> as;
A composed = as.reduce (() -> {}, Function::compose);
Run Code Online (Sandbox Code Playgroud)
结果我希望有一个函数A,它调用每个AStream的方法doIt.
composed.doIt (); // Executes every doIt ()
Run Code Online (Sandbox Code Playgroud)
但由于A 不是实现者Function,因此Function::compose不可能使用方法参考.我不能从Function(或Supplier)扩展,因为那时我将有两个抽象方法(我自己和来自Function).
我能做些什么来使我的功能成为可能A呢?
假设我有一个Iterator<Class1>对象. Class1提供了一个stringFunction()返回a 的方法String.
有没有办法以String.join一种方式调用迭代器返回的stringFunction()每一个Class1,并连接由分隔符分隔的函数结果?
有一个String.join过载,需要一个Iterable<CharSequence>; 是否可以从Iterator<Class1>和创建一个stringFunction,以便join可以使用它?
class Foo{
int len;
}
public class Main {
public static void main(String[] args) throws Exception{
System.out.println(Stream.of("alpha", "beta", "gamma", "delta").parallel().reduce(
new Foo(),
(f, s) -> { f.len += s.length(); return f; },
(f1, f2) -> {
Foo f = new Foo();
/* check self-reduction
if (f1 == f2) {
System.out.println("equal");
f.len = f1.len;
return f;
}
*/
f.len = f1.len + f2.len;
return f;
}
).len);
}
Run Code Online (Sandbox Code Playgroud)
代码尝试计算几个字符串的总长度.
这段代码仅在
1.I使用顺序流(通过删除"parallel()"函数调用)
或
2.I使用Integer而不是Foo 时才打印19
,这只是一个int的包装器.
否则控制台将打印20或36.为了调试这个问题,我添加了代码"check self-reduction",它确实改变了输出:"equal"总是被打印两次.控制台有时会打印8,有时打印10.
我的理解是reduce()是并行foldr/foldl的Java实现.reduce()的第三个参数,combiner用于合并缩减的并行执行结果.是对的吗?如果是这样,为什么减少的结果需要与自身结合?此外,如何修复此代码,以便它提供正确的输出并仍然并行运行?
编辑:请忽略我没有使用方法参考来简化代码的事实,因为我的最终目标是通过向Foo添加更多字段来压缩.
我有一套和一个方法:
private static Set<String> set = ...;
public static String method(){
final String returnVal[] = new String[1];
set.forEach((String str) -> {
returnVal[0] += str;
//if something: goto mark
});
//mark
return returnVal[0];
}
Run Code Online (Sandbox Code Playgroud)
我可以在lambda中终止forEach(使用或不使用例外)吗?我应该使用匿名课吗?
我能做到这一点:
set.forEach((String str) -> {
if(someConditions()){
returnVal[0] += str;
}
});
Run Code Online (Sandbox Code Playgroud)
但是浪费时间.
使用stream.reduce实现
return set.parallelStream().reduce((output, next) -> {
return someConditions() ? next : output;
}).get(); //should avoid empty set before
Run Code Online (Sandbox Code Playgroud)
我正在寻找最快的解决方案,因此如果它们足够快,那么每个循环的异常和"真实"是可以接受的.
我正在使用Netbeans连接数据库.我想使用Java持久性从数据库中检索数据但我收到这些错误:
jun 18, 2014 9:41:44 AM org.hibernate.annotations.common.Version <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.2.Final}
jun 18, 2014 9:41:44 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.2.6.Final}
jun 18, 2014 9:41:44 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
jun 18, 2014 9:41:44 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Exception in thread "AWT-EventQueue-0" java.lang.ExceptionInInitializerError
at controle_entregas.controleEntregasUI.jMenuItemNovaEntregaActionPerformed(controleEntregasUI.java:199)
at controle_entregas.controleEntregasUI.access$100(controleEntregasUI.java:18)
at controle_entregas.controleEntregasUI$2.actionPerformed(controleEntregasUI.java:85)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
at java.awt.Component.processMouseEvent(Component.java:6527)
at …Run Code Online (Sandbox Code Playgroud) 我是否能够使用默认方法来扩展现有的JDK接口,比如List为实现它的任何东西添加额外的方法?
如果是这样,是否有一个简单的例子?
我想尝试lambdas的一些功能,并希望过滤一个ArrayList并使用IntStream的方法来计算数组的ArrayList的平均值和最大值
我的第一个想法是只过滤ArrayList,保存流然后使用方法来计算:
ArrayList<Integer> arr = new ArrayList<>();
arr.add(5);
arr.add(7);
arr.add(11);
IntStream s = arr.stream().filter(i -> i < 10).mapToInt(i -> (int)i);
int maxBelowTen = s.max().getAsInt();
double avgBelowTen = s.average().getAsDouble();
System.out.println("Maximum below ten: " + maxBelowTen);
System.out.println("Average below ten: " + avgBelowTen);
Run Code Online (Sandbox Code Playgroud)
但是,这会抛出java.lang.IllegalStateException:stream已经被操作或关闭
通过这些信息,我当然可以通过打开两个流并过滤两次来实现它
int maxBelowTen = arr.stream().filter(i -> i < 10).mapToInt(i -> (int) i).max().getAsInt();
double avgBelowTen = arr.stream().filter(i -> i < 10).mapToInt(i -> (int) i).average().getAsDouble();
Run Code Online (Sandbox Code Playgroud)
但我现在的问题是关于表现.如果我必须过滤并映射两次流,那不是很慢.为什么我不能在流上多次操作,我不明白为什么他们这样实现它.在操作之后是否可以保持流打开,因为每个操作符方法都返回一个新流或单个值.
这是什么原因,或者我只是错误使用它?
我刚刚发现java 8允许引用具有更具体的返回类型和更一般参数的方法.
import java.util.function.Function;
public class MethodReferences {
public static Integer function(Object o) {
return 2;
}
public static void main(String[] args) {
Function<String, Object> function = MethodReferences::function;
}
}
Run Code Online (Sandbox Code Playgroud)
这非常灵活.
但为什么他们没有将此扩展到其他案例?
例如:
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<String, Object> function = function();
}
private static Function<Object, Integer> function() {
return new Function<Object, Integer>() {
@Override
public Integer apply(Object o) {
return 1;
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
编译失败:
Type mismatch: cannot …Run Code Online (Sandbox Code Playgroud) 使用Java 8编译的Java 8代码库是否可以在Java 6 VM上运行?
我刚刚开始使用Sonar,我有一个JDK 8项目.到目前为止我唯一遇到的问题是:
Reorder the modifiers to comply with the Java Language Specification.
Run Code Online (Sandbox Code Playgroud)
这种情况发生在接口中的默认方法中,例如
default boolean isValid([params here]) {
/*method body here*/
}
Run Code Online (Sandbox Code Playgroud)
我知道这确实是一个小问题,但我不想禁用任何规则,所以你如何解决它?
非常感谢你!
ps我在谷歌上没有找到任何东西,我知道这个规则意味着什么(我已经阅读了它的描述),但我无法弄清楚如何处理默认关键字.
更新:它看起来像一个bug,我曾报道在这里,https://jira.codehaus.org/browse/SONARJAVA-590 更新2:看起来它已经固定,它会在2.4版本中提供.
java-8 ×10
java ×9
lambda ×2
collections ×1
concurrency ×1
hibernate ×1
iterable ×1
java-stream ×1
jpa ×1
persistence ×1
rule ×1
sonarqube ×1