标签: java-8

Java 8和广义目标类型推断

我安装了最后一个JDK 8 ea b114来测试新的语言功能.然而,链式调用中的推断似乎还没有奏效.

如果我写:

Iterator<String> it = new ArrayList<>().iterator();
Run Code Online (Sandbox Code Playgroud)

编译器给我一个错误.

然而,论证位置的推论效果很好.

也许不会插入链式调用中的推断?

java generics java-8

20
推荐指数
2
解决办法
3957
查看次数

递归流

我想使用Java 8以递归方式列出计算机上的所有文件.

Java 8提供了listFiles一种返回所有文件和目录但没有递归的方法.如何使用它来获取完整的递归文件列表(不使用变异集合)?

我已经尝试了下面的代码,但它只有一个深度:

static Function<Path, Stream<Path>> listFiles = p -> {
    if (p.toFile().isDirectory()) {
        try { return Files.list(p); }
        catch (Exception e) { return Stream.empty(); }
    } else {
        return Stream.of(p);
    }
};

public static void main(String[] args) throws IOException {
    Path root = Paths.get("C:/temp/");
    Files.list(root).flatMap(listFiles).forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud)

并且使用return Files.list(p).flatMap(listFiles);不编译(不确定为什么)...

注意:我对涉及FileVisitors或外部库的解决方案不感兴趣.

java recursion file java-8 java-stream

20
推荐指数
1
解决办法
7431
查看次数

Eclipse对jfxrt.jar类的访问限制发出警告

我正在使用eclipse kepler和java SE 1.8 jdk系统库,但是当我使用任何javafx类或方法时,eclipse会发出类似的警告Access restriction: The type 'TableColumn<?,?>' is not API (restriction on required library 'C:\Program Files\Java\jdk1.8.0_05\jre\lib\ext\jfxrt.jar').

我已经尝试向系统库添加访问规则,以允许使用通配符访问库中的所有jar,*但警告仍然存在.我也使用maven建设项目.代码有效,但警告是唠叨,并且在我编码时影响可读性.任何帮助表示赞赏.

编辑:我也尝试@SuppressWarnings("restriction")在我的课程开头添加,但这仍然无法解决未知原因并隐藏我可能需要看到的所有其他限制警告

eclipse javafx maven java-8 eclipse-kepler

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

声纳:用方法参考替换此lambda

这段代码示例

Collection<Number> values = transform(
        getValuatedObjects(),
        input -> getValueProvider().apply(input).getValue());
Run Code Online (Sandbox Code Playgroud)

违反了声纳规则:

尽可能用方法引用替换lambdas

它是声纳虫吗?或者我真的可以使用方法参考吗?

lambda java-8 sonarqube

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

Java8:使用流将一个映射转换为另一个映射

我需要将Java转换HashMapTreeMap(包括地图内容)的实例

HashMap<String, Object> src = ...;
TreeMap<String, Object> dest = src.entrySet().stream()
        .filter( ... )
        .collect(Collectors.toMap( ???, ???, ???, TreeMap::new));
Run Code Online (Sandbox Code Playgroud)

我应该用什么来代替???使这些代码可编辑?

java lambda java-8 java-stream

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

使用Files.lines修改文件

我想读一个文件并用新文本替换一些文本.使用asm和int 21h会很简单,但我想使用新的java 8流.

    Files.write(outf.toPath(), 
        (Iterable<String>)Files.lines(inf)::iterator,
        CREATE, WRITE, TRUNCATE_EXISTING);
Run Code Online (Sandbox Code Playgroud)

在那里的某个地方,我想要一个lines.replace("/*replace me*/","new Code()\n");.新行是因为我想测试在某处插入一段代码.

这是一个游戏示例,它不是我想要的方式,但编译.我只需要一种方法来拦截迭代器中的行,并用代码块替换某些短语.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import static java.nio.file.StandardOpenOption.*;
import java.util.Arrays;
import java.util.stream.Stream;

public class FileStreamTest {

    public static void main(String[] args) {
        String[] ss = new String[]{"hi","pls","help","me"};
        Stream<String> stream = Arrays.stream(ss);

        try {
            Files.write(Paths.get("tmp.txt"),
                    (Iterable<String>)stream::iterator,
                    CREATE, WRITE, TRUNCATE_EXISTING);
        } catch (IOException ex) {}

//// I'd like to hook this next part into Files.write part./////
        //reset stream
        stream = Arrays.stream(ss);
        Iterable<String> it = stream::iterator;
        //I'd like …
Run Code Online (Sandbox Code Playgroud)

java-8 java-stream

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

为什么我不能直接将方法引用分配给Object类型的变量?

关于java-8语法的简单问题.为什么JLS-8限制这样的表达式:

Object of_ref = Stream::of;  // compile-time error
Run Code Online (Sandbox Code Playgroud)

并允许只有这样的东西:

java.util.function.Function of_ref = Stream::of;
Object obj = of_ref; // compiles ok
Run Code Online (Sandbox Code Playgroud)

java syntax java-8

20
推荐指数
4
解决办法
8102
查看次数

Java Stream:有没有办法迭代一次取两个元素而不是一个?

假设我们有这个流

Stream.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j");
Run Code Online (Sandbox Code Playgroud)

我想在地图中保存相邻字符串的对,其中第一个以"错误"开头.

我想到的是这样的

Map<String, String> map = new HashMap<>();

Stream.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j")
.reduce((acc, next) -> {
    if (acc.startsWith("err"))
        map.put(acc,next);
    if (next.startsWith("err"))
        return next;
    else
        return "";
});
Run Code Online (Sandbox Code Playgroud)

但出于两个主要原因,我并不完全满意

  1. 我在"滥用" reduce功能.在Stream API中,每个函数都有其明确,明确的目的:max应该计算最大值,filter应该根据条件进行过滤,reduce应该产生递增累积值等等.
  2. 这样做会阻止我使用Streams强大的机制:如果我想将搜索限制在前两个结果中怎么办?

在这里我使用reduce因为(据我所知)它是唯一的功能,它可以让你比较几个值,你可以,不知何故,回到类似"当前值"和"下一个值"的概念.

有更简单的方法吗?是否允许您为每次迭代考虑多个值来迭代流?

编辑

我正在考虑的是一些机制,给定当前元素,允许您为每次迭代定义要考虑的"元素窗口".

就像是

<R> Stream<R> mapMoreThanOne(
    int elementsBeforeCurrent,
    int elementsAfterCurrent,
    Function<List<? super T>, ? …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

确定lambda表达式在Java中是无状态还是有状态

是否有一个函数接受对lambda表达式的引用并返回一个布尔值,表示lambda表达式是否为无状态?如何确定lambda表达式的有状态?

java lambda java-8 java-9

20
推荐指数
2
解决办法
1604
查看次数

Java - 如何使用JVM Config仅为某些协议禁用TLS密码?

我已经看到很多使用jdk.tls.disabledAlgorithms在java中禁用TLS密码的例子,例如:

 jdk.tls.disabledAlgorithms=MD2, RSA keySize < 1024, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
Run Code Online (Sandbox Code Playgroud)

但是,我如何禁用某些协议的密码,使用jdk.tls.disabledAlgorithms或类似的配置?

例如,我怎么可以禁用TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256TLSv1.1唯一?

它似乎不支持opensssl这样做的方式,就像这样:

TLSv1.1:!TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
Run Code Online (Sandbox Code Playgroud)

它不会导致任何错误,但仍然允许使用密码.

编辑:请注意,我只对基于JVM配置的答案感兴趣,因为我不控制许多这些服务器上的代码,只有JVM和JVM配置.有些甚至是第三方服务器,因此更多的是操作级别的东西.

编辑2:请注意,您可以运行一个Java应用程序并提供更改使用哪些协议和密码的参数,例如java -server -Djava.security.properties=./my/custom/java.security -jar myapp.jar它会这样做 - 但它不会让您通过协议过滤密码,只能从我看到的密码或协议中过滤密码.该文件将包含一个属性条目jdk.tls.disabledAlgorithms

java java-8

20
推荐指数
2
解决办法
1610
查看次数