相关疑难解决方法(0)

抛出异常的Java 8 Lambda函数?

我知道如何创建对具有String参数并返回一个方法的方法的引用int,它是:

Function<String, Integer>
Run Code Online (Sandbox Code Playgroud)

但是,如果函数抛出异常,这不起作用,比如说定义为:

Integer myMethod(String s) throws IOException
Run Code Online (Sandbox Code Playgroud)

我该如何定义这个参考?

java lambda java-8

438
推荐指数
14
解决办法
28万
查看次数

Java 8 Iterable.forEach()vs foreach循环

在Java 8中,以下哪项更好?

Java 8:

joins.forEach(join -> mIrc.join(mSession, join));
Run Code Online (Sandbox Code Playgroud)

Java 7:

for (String join : joins) {
    mIrc.join(mSession, join);
}
Run Code Online (Sandbox Code Playgroud)

我有很多可以用lambdas"简化"的for循环,但使用它们真的有什么好处吗?它会改善他们的性能和可读性吗?

编辑

我还将这个问题扩展到更长的方法.我知道你不能从lambda中返回或破坏父函数,在比较它们时也应该考虑到这一点,但还有什么需要考虑的吗?

java for-loop java-8 java-stream

436
推荐指数
7
解决办法
35万
查看次数

Java 8:Lambda-Streams,按方法过滤,具有异常

我在尝试Java 8的Lambda表达式时遇到了问题.通常它工作正常,但现在我有方法可以抛出IOException.最好看一下以下代码:

class Bank{
    ....
    public Set<String> getActiveAccountNumbers() throws IOException {
        Stream<Account> s =  accounts.values().stream();
        s = s.filter(a -> a.isActive());
        Stream<String> ss = s.map(a -> a.getNumber());
        return ss.collect(Collectors.toSet());
    }
    ....
}

interface Account{
    ....
    boolean isActive() throws IOException;
    String getNumber() throws IOException;
    ....
}
Run Code Online (Sandbox Code Playgroud)

问题是,它不能编译,因为我必须捕获isActive-和getNumber-Methods的可能例外.但即使我明确使用如下所示的try-catch-Block,它仍然无法编译,因为我没有捕获异常.所以要么JDK中存在错误,要么我不知道如何捕获这些异常.

class Bank{
    ....
    //Doesn't compile either
    public Set<String> getActiveAccountNumbers() throws IOException {
        try{
            Stream<Account> s =  accounts.values().stream();
            s = s.filter(a -> a.isActive());
            Stream<String> ss = s.map(a -> a.getNumber());
            return ss.collect(Collectors.toSet());
        }catch(IOException ex){
        } …
Run Code Online (Sandbox Code Playgroud)

java lambda exception-handling java-8

161
推荐指数
6
解决办法
12万
查看次数

Java 8:如何使用流中的异常抛出方法?

假设我有一个类和一个方法

class A {
  void foo() throws Exception() {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我想为A一个流传递的每个实例调用foo,如:

void bar() throws Exception {
  Stream<A> as = ...
  as.forEach(a -> a.foo());
}
Run Code Online (Sandbox Code Playgroud)

问题:如何正确处理异常?代码无法在我的机器上编译,因为我没有处理foo()可能抛出的异常.在throws Exceptionbar似乎是没用在这里.这是为什么?

java unhandled-exception java-8 java-stream

154
推荐指数
7
解决办法
14万
查看次数

Java 8:在lambda表达式中强制检查异常处理.为什么强制,不是可选的?

我正在使用Java 8中的新lambda特性,并发现Java 8提供的实践非常有用.但是,我想知道是否有一种很好的方法可以解决以下情况.假设您有一个对象池包装器,需要某种工厂来填充对象池,例如(使用java.lang.functions.Factory):

public class JdbcConnectionPool extends ObjectPool<Connection> {

    public ConnectionPool(int maxConnections, String url) {
        super(new Factory<Connection>() {
            @Override
            public Connection make() {
                try {
                    return DriverManager.getConnection(url);
                } catch ( SQLException ex ) {
                    throw new RuntimeException(ex);
                }
            }
        }, maxConnections);
    }

}
Run Code Online (Sandbox Code Playgroud)

将函数接口转换为lambda表达式后,上面的代码变为:

public class JdbcConnectionPool extends ObjectPool<Connection> {

    public ConnectionPool(int maxConnections, String url) {
        super(() -> {
            try {
                return DriverManager.getConnection(url);
            } catch ( SQLException ex ) {
                throw new RuntimeException(ex);
            }
        }, maxConnections); …
Run Code Online (Sandbox Code Playgroud)

java lambda checked-exceptions java-8

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

Java 8方法引用未处理的异常

我正在使用Java 8进行项目,发现了一种我无法理解的情况.

我有这样的代码:

void deleteEntity(Node node) throws SomeException {
    for (ChildNode child: node.getChildren()) {
       deleteChild(child);
    }
}

void deleteChild(Object child) throws SomeException {
    //some code
}
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常,但我可以用方法引用重写它:

void deleteEntity(Node node) throws SomeException {
    node.getChildren().forEach(this::deleteChild);
}
Run Code Online (Sandbox Code Playgroud)

并且此代码无法编译,从而产生错误Incompatible thrown types *SomeException* in method reference.

IDEA也给了我错误unhandled exception.

所以,我的问题是为什么?为什么代码为每个循环编译而不用lambda编译?

java lambda java-8

59
推荐指数
2
解决办法
3万
查看次数

Java/C#中检查的异常是什么?

我是一名C#开发人员,偶尔用Java编写代码.有人可以用简单的术语解释Java中检查的异常是什么以及为什么需要它?没有在C#中遇到过这个术语.

c# java exception

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

如何使用foreach循环遍历java 8流

假设我们尝试向java 8流应用一个可能抛出已检查异常的lambda:

Stream<String> stream = Stream.of("1", "2", "3");
Writer writer = new FileWriter("example.txt");

stream.forEach(s -> writer.append(s)); // Unhandled exception: java.io.IOException
Run Code Online (Sandbox Code Playgroud)

这不会编译.

一种解决方法是嵌套已检查的异常,RuntimeException但它使以后的异常处理变得复杂,而且它只是丑陋:

stream.forEach(s -> {
    try {
        writer.append(s);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
});
Run Code Online (Sandbox Code Playgroud)

另一种解决方法可能是转换有限的功能forEach,以普通的旧的foreach 循环是比较友好的检查的异常.

但天真的方法失败了:

for (String s : stream) { // for-each not applicable to expression type 'java.util.stream.Stream<java.lang.String>'
    writer.append(s);
}

for (String s : stream.iterator()) { // foreach not applicable to type 'java.util.Iterator<java.lang.String>'
    writer.append(s);
} …
Run Code Online (Sandbox Code Playgroud)

java foreach for-loop java-8 java-stream

22
推荐指数
1
解决办法
1万
查看次数

Java 8 Streams - 超时?

我想循环一个庞大的数组并做一组复杂的指令需要很长时间.但是,如果超过30秒,我希望它放弃.

恩.

final long start = System.currentTimeMillis();
myDataStructure.stream()
    .while(() -> System.currentTimeMillis() <= start + 30000)
    .forEach(e ->
    {
      ...
    });
Run Code Online (Sandbox Code Playgroud)

如果满足某个条件,我想避免returnforEach通话中说话.

java java-8 java-stream

18
推荐指数
4
解决办法
3735
查看次数

即使抛出异常,如何迭代流?

stream.map(obj -> doMap(obj)).collect(Collectors.toList());

private String doMap(Object obj) {
    if (objectIsInvalid) {
    throw new ParseException("Object could not be parsed");
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:如何抛出异常并使流迭代知道它不应该破坏整个迭代,而是继续下一个元素(并最终记录失败的对象)?

java java-8 java-stream

7
推荐指数
2
解决办法
4011
查看次数