标签: java-8

撰写Java-8-Functional-Interface

我有一个像这样的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呢?

java functional-programming java-8 functional-interface

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

使用与迭代器和String函数的连接

假设我有一个Iterator<Class1>对象. Class1提供了一个stringFunction()返回a 的方法String.

有没有办法以String.join一种方式调用迭代器返回的stringFunction()每一个Class1,并连接由分隔符分隔的函数结果?

有一个String.join过载,需要一个Iterable<CharSequence>; 是否可以从Iterator<Class1>和创建一个stringFunction,以便join可以使用它?

java java-8

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

使用并行流时,减少行为很奇怪,但在Java 8u5中适用于顺序流

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添加更多字段来压缩.

java parallel-processing concurrency java-8

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

尽早终止Iterable.forEach

我有一套和一个方法:

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)

我正在寻找最快的解决方案,因此如果它们足够快,那么每个循环的异常和"真实"是可以接受的.

java lambda iterable java-8

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

Java JPA Hibernate连接问题

我正在使用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)

persistence hibernate jpa persistence.xml java-8

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

扩展现有JDK接口的默认方法

我是否能够使用默认方法来扩展现有的JDK接口,比如List为实现它的任何东西添加额外的方法?

如果是这样,是否有一个简单的例子?

java java-8

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

Java Lambda重用Stream

我想尝试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 collections lambda java-8 java-stream

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

方法参考,协方差逆变

我刚刚发现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 java-8

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

可以编译Java 8代码库并在Java 6 VM上运行吗?

使用Java 8编译的Java 8代码库是否可以在Java 6 VM上运行?

java java-8

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

声纳规则 - 重新排序接口默认方法的修饰符

我刚刚开始使用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 rule java-8 sonarqube

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