我有一个名为"Book"的数据结构,它包含以下字段:
public final class Book {
private final String title;
private final BookType bookType;
private final List<Author> authors;
}
Run Code Online (Sandbox Code Playgroud)
我的目标是Map<Author, List<BookType>>从List<Book>使用Stream API 派生出来.
为了实现它,我首先制作了一个for-each循环来阐明解决方案的步骤,并在我将其重新编写为基于流的方法后逐步完成:
Map<Author, List<BookType>> authorListBookType = new HashMap<>();
books.stream().forEach(b -> b.getAuthors().stream().forEach(e -> {
if (authorListBookType.containsKey(e)) {
authorListBookType.get(e).add(b.getBookType());
} else {
authorListBookType.put(e, new ArrayList<>(Collections.singletonList(b.getBookType())));
}
}));
Run Code Online (Sandbox Code Playgroud)
但它不是基于Stream API的解决方案,而且我已陷入困境,我不知道如何正确完成它.我知道我必须使用分组收集器Map<Author, List<BookType>>从流中获取所需的直接.
你能给我一些提示吗?
我已经完成了有效的Java书籍,之后我感到困惑.在本书中,Bloch坚持要求减少可变性,使字段最终,拒绝公共构造函数并支持工厂或构建器模式,使用最终类和方法禁用继承等.
但是现在我正在开发一个基于Spring框架的项目,并且:
第一眼看来,本书的大部分内容都被AOP,模拟和Spring Data/Hibernate所侵犯.
我该怎么处理呢?这本书在实践中没用吗?
你能帮帮我Java Streams吗?
正如你从标题中看到的,我需要合并List<Map<String, Map<String, Genuineness>>>到Map<String, Map<String, Genuineness>>.
该列表表示为List<Map<String, Map<String, Genuineness>>>:
[
{
"USER_1":{
"APP_1":{
"total":1,
"totalGenuine":1,
"totalDevelopment":1
}
},
"USER_2":{
"APP_1":{
"total":1,
"totalGenuine":1,
"totalDevelopment":1
},
"APP_2":{
"total":2,
"totalGenuine":2,
"totalDevelopment":2
}
}
},
{
"USER_1":{
"APP_1":{
"total":1,
"totalGenuine":1,
"totalDevelopment":1
}
},
"USER_2":{
"APP_1":{
"total":1,
"totalGenuine":1,
"totalDevelopment":1
},
"APP_2":{
"total":2,
"totalGenuine":2,
"totalDevelopment":2
}
}
}
]
Run Code Online (Sandbox Code Playgroud)
因此,正如您所看到的,重复的键可能无处不在.我的目标是Map<String, Map<String, Genuineness>>通过合并将它们组合在一起Genuineness.合并Genuineness只是意味着返回一个新的对象与总结了值total,totalGenuine和totalDevelopment.
这是我的实现失败:
final Map<String, …Run Code Online (Sandbox Code Playgroud) 如果微服务是可扩展的,例如部署为 AWS 上的 ECS,那么在微服务开发中是否应该使用并行编程?
如果是,那么与 N 个实例消耗相同资源相比,一个实例消耗更多资源有什么好处?
并行编程如何匹配https://12factor.net/
PS 更具体地说 - 我应该在概念上使用并行流而不是简单流吗?
java parallel-processing multithreading scalability 12factor
你能解释一下如何System.in正确模拟吗?
我有一个简单的测试,我将值分配给
@Test
public void testBarCorrect() {
System.setIn(new ByteArrayInputStream("7\n2\n3".getBytes()));
someService().consume();
}
Run Code Online (Sandbox Code Playgroud)
在引擎盖下我什么都不做 new Scanner(System.in);
需要注意的是,有时我的测试是绿色的,但在 80% 时它会抛出一个 Exception "java.util.NoSuchElementException: No line found".
所以,如果我在测试中按下运行,它就会出现异常。
你能给我任何提示吗?
我的测试:
public class RecordServiceCTLIntegrationTest {
private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
private final PrintStream originalOut = System.out;
private static final InputStream DEFAULT_STDIN = System.in;
@Before
public void setUpStreams() {
System.setOut(new PrintStream(outContent));
System.setIn(DEFAULT_STDIN);
}
@After
public void rollbackChangesToStdin() {
System.setOut(originalOut);
System.setIn(DEFAULT_STDIN);
}
@Test
public void testBarCorrect() {
System.setIn(new ByteArrayInputStream("5\n1\nB\n21\n\n".getBytes()));
buildRecordServiceCTL().run();
assertEquals("Enter Room Id: No …Run Code Online (Sandbox Code Playgroud) 我想问你一个关于Java多线程的问题。
我有一个监视器,多个线程渴望拥有它。此外,临界区内部this.wait()也会根据某些条件被调用。
AFAIK,监视器有 2 组线程:
this.wait()等待被唤醒的线程notify但是当/notifyAll被调用时,它们如何竞争呢?等待集中的线程是否比条目集中的线程具有获取监视器的优先级,或者它们是否移动到条目集?
我能否确定下notify一个执行的线程将是等待集中的线程?
你能告诉我 Spring 的默认参数是什么,@Async ThreadPoolTaskExecutor或者我怎么能找到我自己的参数?
maxPoolSize、corePoolSize 和 queueCapcity 的默认值是什么?
我应该覆盖它们以改进我的应用程序还是使用默认值就可以了?
我正在阅读 Spring 文档并发现了这个
让 Spring 容器释放原型范围 bean 使用的资源的一种可能方法是使用自定义 bean 后处理器,该处理器将保存对需要清理的 bean 的引用。
但是,如果bean后处理器持有对原型对象的引用,那么垃圾收集器将不会清理它,并且原型bean及其资源将驻留在堆中,直到应用程序上下文关闭?
请您澄清一下好吗?
我正在为我的控制器编写单元测试,并遇到一个问题,即desktop.properties文件在我的构建服务器上不存在并且不应该存在于那里。
我有这个主要的 SpringBoot 类:
@Configuration
@ComponentScan(basePackages="com.xxx")
@EnableJpaRepositories(basePackages = "com.xxx")
@PropertySources(value = {@PropertySource("classpath:desktop.properties")})
@EnableAutoConfiguration(exclude={JmsAutoConfiguration.class, SecurityAutoConfiguration.class, MultipartAutoConfiguration.class})
@ImportResource(value = {"classpath:multipart.xml","classpath:column-maps-config.xml","classpath:model-ui-name-maps-config.xml"})
public class ApplicationConfig extends WebMvcConfigurerAdapter implements EnvironmentAware, WebApplicationInitializer {
}
Run Code Online (Sandbox Code Playgroud)
desktop.properties正如您所注意到的,这个类是导入的。
我有一个测试课程,开头是:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ApplicationConfig.class)
@WebAppConfiguration
public class SomeControllerTest {
}
Run Code Online (Sandbox Code Playgroud)
如果我的环境没有该desktop.properties文件或者我只是删除它,则无法运行测试,因为ApplicationConfig没有依赖项就无法实例化类。
我的问题是如何模拟desktop.properties或创建用于测试目的的自定义配置,以便替换@ContextConfiguration(classes = ApplicationConfig.class)我的测试上下文?
您能给我一些提示吗?
PS当前的项目是一个相当老的项目,版本也很旧,所以这只是我发现的一种为控制器创建测试的方法,对控制器进行最小的更改pom.xml
我正在尝试进行以下修改:
final Map<String, List<Map<String, String>>> scopes = scopeService.fetchAndCacheScopesDetails();
final Map<String, Map<String, String>> scopesResponse = scopes.entrySet().stream().collect
(Collectors.toMap(Map.Entry::getKey, e -> e.getValue()
.stream().collect(Collectors.toMap(s -> (String) s.get(SCOPE_NM), s -> (String) s.get(SCOPE_ID))))
);
Run Code Online (Sandbox Code Playgroud)
但我面临"Duplicate key"错误,所以我想scopeResponses改为Map<String, Map<String, List<String>>>
你能告诉我如何将值合并s -> (String) s.get(SCOPE_ID)到一个List或Set在这种情况下?
java ×10
spring ×4
java-stream ×3
collectors ×2
hashmap ×2
12factor ×1
aop ×1
barrier ×1
concurrency ×1
java-8 ×1
junit ×1
lambda ×1
mutex ×1
prototype ×1
scalability ×1
spring-async ×1
spring-data ×1
spring-ioc ×1
spring-test ×1
system.in ×1
unit-testing ×1