小编deH*_*aar的帖子

用于"管道"的Java习语

是否有一个更简洁/标准的习惯用法(例如,JDK方法)用于"管道"输入到Java中的输出而不是以下?

public void pipe(Reader in, Writer out) {
    CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE);
    while (in.read(buf) >= 0 ) {
        out.append(buf.flip());
        buf.clear();
    }
}
Run Code Online (Sandbox Code Playgroud)

[编辑]请注意,ReaderWriter给予.正确答案将演示如何获取inout形成管道(最好不超过1或2个方法调用).我将接受答案,其中inoutInputStreamOutputStream(最好是从/到Reader/ 的转换Writer).我不会接受的答案无论是地方in还是out是一个子类Reader/ InputStreamWriter/ OutputStrem.

java io pipe

9
推荐指数
1
解决办法
2347
查看次数

重构使用流API的方法

目前,我被告知要对所有在某些服务器上挂出的.sql文件进行计数。手动解决这个非常基本的任务不是一个选择,相反,我编写了一些代码,该代码利用a SimpleFileVisitor<Path>并将找到的所有sql文件及其父路径存储在a中Map<Path, List<Path>>

现在,我希望接收独立于其位置发现的sql文件总数。我使用增强for循环(几乎是经典方式)来工作:

public int getTotalAmountOfSqlFiles(Map<Path, List<Path>> sqlFilesInDirectories) {
    int totalAmount = 0;

    for (Path directory : sqlFilesInDirectories.keySet()) {
        List<Path> sqlFiles = sqlFilesInDirectories.get(directory);
        totalAmount += sqlFiles.size();
    }

    return totalAmount;
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,如何使用流API进行相同操作?

我无法使可编译代码正常工作,这显然没有做错事。不幸的是,
以下几行对我来说似乎是个好主意,但对编译器而言却不是。

totalAmount = sqlFilesInDirectories.entrySet().stream().map(List::size).sum();
Run Code Online (Sandbox Code Playgroud)

编译器说

无法推断以下类型的参数 <R> map(Function<? super T,? extends R>

有谁知道我在做什么错(也许使用解决方案提供了一些受过教育的流API)?

java sum java-8 java-stream

8
推荐指数
1
解决办法
384
查看次数

Java:足够的免费堆来创建一个对象?

我最近在一些代码中遇到过这种情况 - 基本上有人试图创建一个大对象,当没有足够的堆来创建它时应对:

try {
    // try to perform an operation using a huge in-memory array
    byte[] massiveArray = new byte[BIG_NUMBER];
} catch (OutOfMemoryError oome) {
    // perform the operation in some slower but less
    // memory intensive way...
}
Run Code Online (Sandbox Code Playgroud)

这似乎不对,因为Sun自己建议您不要尝试捕获Error或其子类.我们讨论过它,另一个想法是显式检查空闲堆:

if (Runtime.getRuntime().freeMemory() > SOME_MEMORY) {
    // quick memory-intensive approach
} else {
    // slower, less demanding approach
}
Run Code Online (Sandbox Code Playgroud)

同样,这似乎并不令人满意 - 特别是因为选择一个值SOME_MEMORY很难轻易地与相关工作相关:对于某些任意大型对象,我如何估计其实例化可能需要多少内存?

有没有更好的方法呢?它甚至可以在Java中使用,还是在语言本身的抽象级别之下管理内存?

编辑1:在第一个例子中,估计byte[]给定长度的内存量可能实际上是可行的,但是有一种更通用的方法可以扩展到任意大对象吗?

编辑2:正如@erickson指出的那样,有一些方法可以在创建对象后估计对象的大小,但是(忽略基于先前对象大小的统计方法)是否有办法对尚未创建的对象执行此操作?

似乎还有一些争论是否合理OutOfMemoryError- 有人知道任何结论吗?

java

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

如何从数组中的数组的第一个元素创建新数组

如何从这个数组的数组的第一个元素创建新数组?

[["1",2],["3",2],["6",2]] 
Run Code Online (Sandbox Code Playgroud)

我希望它是

['1', '3', '6'] 
Run Code Online (Sandbox Code Playgroud)

我的尝试:

[["1",2],["3",2],["6",2]] 
Run Code Online (Sandbox Code Playgroud)

javascript arrays

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

有没有办法在Android中检测德语变音

我正在尝试使用软键盘检测德语变音。为了识别输入的字符,我使用了方法onKeyUp()。但是这种方法不适用于德语变音。

有没有办法让我认出他们?

android android-keypad

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

HashMap K和V的默认类型

我通常键入我的地图声明,但是正在做一些maint并找到一个没有输入.这让我想到了(哦不!).Map声明的默认输入是什么.考虑以下:

Map map = new HashMap();
map.put("one", "1st");
map.put("two", new Integer(2));
map.put("three", "3rd");
for (Map.Entry entry : map.entrySet()) {
    System.out.println(entry.getKey() + " -> " + entry.getValue());
}
Run Code Online (Sandbox Code Playgroud)

Map.Entry上的类型不兼容时出现此错误.所以,如果我输入声明:

Map<Object, Object> map = new HashMap();
Run Code Online (Sandbox Code Playgroud)

一切顺利.那么在声明中设置的默认类型是什么?还是我错过了别的什么?

java generics collections

6
推荐指数
2
解决办法
2582
查看次数

与流API交换实现后,Junit测试失败了,为什么?

我实现了以下方法,概述了Strings及其在a值中的出现Map<String, List<String>>

public static Map<String, Long> getValueItemOccurrences(Map<String, List<String>> map) {
    Map<String, Long> occurrencesOfValueItems = new HashMap<>();

    map.forEach((key, value) -> {
        value.forEach(item -> {
            if (occurrencesOfValueItems.containsKey(item)) {
                occurrencesOfValueItems.put(item, occurrencesOfValueItems.get(item) + 1);
            } else {
                occurrencesOfValueItems.put(item, 1L);
            }
        });
    });

    return occurrencesOfValueItems;
}
Run Code Online (Sandbox Code Playgroud)

我已经使用单个JUnit测试对其进行了测试,并且测试成功。这是(现在还包括进口):

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;

class TryoutTest {

    static Map<String, List<String>> items = new HashMap<>();
    static List<String> largeList = …
Run Code Online (Sandbox Code Playgroud)

hashmap java-8 java-stream

6
推荐指数
1
解决办法
83
查看次数

为什么 build.gradle 中的每个项目都是灰色的?

我正在用 intellij idea 中的 gradle 创建一个新的 Spring Boot 项目。项目创建完成后,发现build.gradle和settings.gradle中的每一项都是灰色的。下图,您可以看到图片上的灰色部分和下划线。

在此处输入图片说明

IntelliJ IDEA 2019.2 x64(终极版)Java8 gradle wrapper 版本 gradle-5.4.1-bin spring boot 版本 2.1.7.RELEASE windows10 17763

plugins {
    id 'org.springframework.boot' version '2.1.7.RELEASE'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
}

repositories {
    maven { url 'https://maven.aliyun.com/repository/public/' }
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
Run Code Online (Sandbox Code Playgroud)

项目运行正常,没有错误

java spring android intellij-idea gradle

6
推荐指数
1
解决办法
582
查看次数

使用Swing进行语法着色

是否有可能有一些像一个JTextArea将基于色彩的一些映射我有一些关键字?

java swing

5
推荐指数
2
解决办法
418
查看次数

在具有不同类型返回的功能接口中为空

我写这段代码,但我不知道为什么编译.

UnaryOperator接受特定类型参数,并返回与其参数类型相同的结果.

我的问题:如果我把一个if-statement返回null,是不是有编译器错误?

null 不是它的论点的类型(在我的例子中是Doll)?

内置的功能接口(如Consumer,UnaryOperator,Function)是否可以返回null而不是标准返回值?

这是我的代码:

import java.util.function.*;

public class Doll {

    private int layer;

    public Doll(int layer) {
        super();
        this.layer = layer;
    }

    public static void open(UnaryOperator<Doll> task, Doll doll) {
        while ((doll = task.apply(doll)) != null) {
            System.out.println("X");
        }
    }

    public static void main(String[] args) {
        open(s -> {
            if (s.layer <= 0)
                return null;
            else
                return new Doll(s.layer--);
        }, new Doll(5));
    }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢!

java if-statement return-type unary-operator

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