是否有一个更简洁/标准的习惯用法(例如,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)
[编辑]请注意,Reader和Writer被给予.正确答案将演示如何获取in和out形成管道(最好不超过1或2个方法调用).我将接受答案,其中in和out是InputStream和OutputStream(最好是从/到Reader/ 的转换Writer).我不会接受的答案无论是地方in还是out是一个子类的Reader/ InputStream或Writer/ OutputStrem.
目前,我被告知要对所有在某些服务器上挂出的.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)?
我最近在一些代码中遇到过这种情况 - 基本上有人试图创建一个大对象,当没有足够的堆来创建它时应对:
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- 有人知道任何结论吗?
如何从这个数组的数组的第一个元素创建新数组?
[["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) 我正在尝试使用软键盘检测德语变音。为了识别输入的字符,我使用了方法onKeyUp()。但是这种方法不适用于德语变音。
有没有办法让我认出他们?
我通常键入我的地图声明,但是正在做一些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)
一切顺利.那么在声明中设置的默认类型是什么?还是我错过了别的什么?
我实现了以下方法,概述了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) 我正在用 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)
项目运行正常,没有错误
我写这段代码,但我不知道为什么编译.
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 ×7
android ×2
java-8 ×2
java-stream ×2
arrays ×1
collections ×1
generics ×1
gradle ×1
hashmap ×1
if-statement ×1
io ×1
javascript ×1
pipe ×1
return-type ×1
spring ×1
sum ×1
swing ×1