小编Kid*_*ler的帖子

使用流来操作String

假设我要删除我的所有非字母String.

String s = "abc-de3-2fg";
Run Code Online (Sandbox Code Playgroud)

我可以用a IntStream来做到这一点:

s.stream().filter(ch -> Character.isLetter(ch)).  // But then what?
Run Code Online (Sandbox Code Playgroud)

为了将此流转换回String实例,我该怎么办?

另外,为什么我不能将a String视为类型的对象流Character

String s = "abc-de3-2fg";

// Yields a Stream of char[], therefore doesn't compile
Stream<Character> stream = Stream.of(s.toCharArray());

// Yields a stream with one member - s, which is a String object. Doesn't compile
Stream<Character> stream = Stream.of(s);
Run Code Online (Sandbox Code Playgroud)

根据javadoc,其Stream创建签名如下:

Stream.of(T ...值)

我能想到的唯一(糟糕的)方式是:

String s = "abc-de3-2fg";
Stream<Character> stream = Stream.of(s.charAt(0), s.charAt(1), s.charAt(2), ...)
Run Code Online (Sandbox Code Playgroud)

当然,这还不够好......我错过了什么?

java string lambda java-8 java-stream

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

DestroyJavaVM线程始终在运行

在分析我的应用程序时,我遇到了一个奇怪的行为 - DestroyJavaVM线程始终在运行 - 100%的时间.

在此输入图像描述 在对该主题进行了一些研究之后,在网上几乎没有任何有价值的信息,我所理解的是该线程应该在退出时卸载JVM.

如果是这种情况,为什么这个线程从我开始申请的第一个时刻起100%的时间处于RUNNING状态?它是否消耗了宝贵的资源,因此可能导致OutOfMemoryError(像我有时得到的)?

是否有任何关于此线程实际执行的内容以及触发其初始化的内容的官方参考?

谢谢

java multithreading jvm java-threads

13
推荐指数
1
解决办法
9393
查看次数

守护进程java进程 - 有这样的事吗?

我的java程序以下列方式创建一个进程:

ProcessBuilder builder = new ProcessBuilder("phantomjs.exe crawl.js");
Process proc = builder.start();
Run Code Online (Sandbox Code Playgroud)

如果java程序突然终止(可能总是发生),则phantomjs进程(不是java进程)可以保持活动状态,并且无法终止它.

我希望在封闭的java进程终止时(无论是否突然)终止phantomjs进程.

有没有办法将Process实例定义为"守护进程"对象,当它的超级进程(执行上面的代码的java进程)终止时会自动终止?

java daemon phantomjs

7
推荐指数
1
解决办法
218
查看次数

单元测试类在eclipse中运行旧版本

我的项目中有一个JUnit测试类,它会逐步更新 - 我每隔几周就会添加一次测试,有时会修改测试代码.

令人惊讶的是,当我使用eclipse JUnit Runner 4运行测试类时,它运行我的旧代码(在更新之前)而不是新代码.我可以更改代码,添加或删除测试,但它仍然运行旧代码.

我试图隔离问题并运行我刚刚编写的单个测试,并且在没有任何堆栈跟踪的情况下得到臭名昭着的"Unrooted tests"错误,以便让我知道问题是什么.

JUnit跑步者响应. test7()确实在编译的测试类中

我做了一些研究,根据这里的一些其他线程,很多人遇到了关于JUnit 3\JUnit 4兼容性的这个问题,但这不是这里的情况 - 我注释了我的所有测试,@Test并没有扩展TestCase类.

清理/构建所有eclipse项目都无济于事.但是,当我清理安装我的项目时,这个问题确实有效,但这需要花费太多时间.此外,重命名类(eclipse中的Alt + Shift + R)会立即运行新代码,但将其重命名为原始(和有效)名称,会使旧代码再次运行(WTF?)

帮助将不胜感激,10倍

eclipse junit junit4 maven maven-surefire-plugin

7
推荐指数
1
解决办法
1425
查看次数

ExecutorService Submit() 无法按预期使用 lambda 版本的 Callable

我正在尝试编写一种机制,可以同时加载一些模型(使用 ExecutorService)并在所有模型完成后检索它们的结果:

List<Future<Model>> modelFutures = new LinkedList<Future<Model>>();
ExecutorService executor = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE);
List<Model> models = new ArrayList<Model>();
for (ClassifierConfig classifierConfig : classifiers) {
    try {
        final String modelFileName = classifierConfig.name + ".model";
        modelFutures.add(executor.submit(new InitModelTask(MODELS_LOCAL_DIR + SEP + modelFileName)));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

for (Future<Model> modelFuture : modelFutures) {
    try {
        models.add(modelFuture.get(MAX_REQUEST_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS));
    } catch (Exception e) {
        System.out.println("Timeout occurred when loading models ");
    }
}
executor.shutdown();
return models;
Run Code Online (Sandbox Code Playgroud)

任务类如下:

public class InitModelTask implements Callable<Model> {

    private String …
Run Code Online (Sandbox Code Playgroud)

java future callable executorservice threadpoolexecutor

5
推荐指数
0
解决办法
5411
查看次数

为什么我实际上需要 Spring Boot 中的接口?

在 Spring/Spring Boot 中编程时,常见的做法是让每个服务/组件实现一个接口,例如:

public interface IAdder {
    int add(int a, int b);
}

@Service
public class Adder implements IAdder {
    public int add(int a, int b) { return a + b; }
}
Run Code Online (Sandbox Code Playgroud)

如果我不打算为“Adder”功能提供多个实现,为什么我实际上需要编写该接口?

该问题的一个常见答案是“您需要它在单元测试中进行模拟”。对此,我可以回答——不完全是。我可以使用您能想到的所有可能的模拟框架(例如 Mockito)来模拟加法器:

@Autowired
IMultiplier multiplier;  // Class under test

@Mock
IAdder adder;

@Test  // Assuming I implement multiplication by multiple additions
public void multiplicationTest() {
    // Arrange
    when(adder).add(3, 3).thenReturn(6);
    
    // Act
    int result = multiplier.multiply(3, 5);
    
    // Assert
    verify(adder, times(4)).add(3, 3);
    assertThat(result).isEqualTo(15);
}
Run Code Online (Sandbox Code Playgroud)

话虽如此,IAdder接口能为我提供什么优势呢?

java spring unit-testing spring-boot

5
推荐指数
1
解决办法
3219
查看次数

java 8减少累加器返回类型

我需要对元素列表进行简单的遍历,对所有元素执行某种转换,然后将所有结果累积到列表中.像这样的东西:

List<GraphEdge> edges = new LinkedList<GraphEdge>();
for (CrawlResult result : crawlResults) {
    edges.addAll(resultToEdges(result));
}
Run Code Online (Sandbox Code Playgroud)

这段代码需要4行,没有什么能比让我在一行中更快乐.因此,java 8流(map + reduce)用于救援.

我尝试使用以下行:

List<GraphEdge> edges = graphResults.stream().
        map(res -> resultToEdges(res)).
        reduce(new LinkedList<GraphEdge>(), (list, res) -> list.addAll(res));
Run Code Online (Sandbox Code Playgroud)

它不会传递编译,因为reduce的第二个参数应该返回一个List,但它返回一个布尔值,它是addAll方法的返回类型.

当然,这种方式可行:

List<GraphEdge> edges = graphResults.stream().
                map(res -> resultToEdges(res)).
                reduce(new LinkedList<GraphEdge>(), (list, res) -> 
                { list.addAll(res); return list; });
Run Code Online (Sandbox Code Playgroud)

但它并不那么优雅.还有其他方式吗?

java reduce lambda dictionary java-8

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