标签: java-8

如何将包含String(内部列表)列表的对象列表转换为String列表

我喜欢上课

public class RoleAccess {

    private String roleId;

    private List<String> apiIdList;

    public String getRoleId() {
        return roleId;
    }

    public void setRoleId(String roleId) {
        this.roleId = roleId;
    }

    public List<String> getApiIdList() {
        return apiIdList;
    }

    public void setApiIdList(List<String> apiIdList) {
        this.apiIdList = apiIdList;
    }

}
Run Code Online (Sandbox Code Playgroud)

我想创建一个新列表,它将添加来自roleaccess的所有apiIdlist

List<String> apiIdList = new ArrayList<>();
for (RoleAccess roleAccess : roleAccessList) {
            if (roleAccess.getApiIdList() != null) {
                apiIdList.addAll(roleAccess.getApiIdList());
            }
        }
Run Code Online (Sandbox Code Playgroud)

我们如何处理流api或哪个是最佳解决方案呢?

我检查了正常的对象列表列表,但我想要列出的对象和内部列表列表我试过这个

  List<String> apiIdList = roleAccessList.stream()
                          .map(RoleAccess::getApiIdList)
                          .collect(ArrayList::new, List::addAll, List::addAll);
Run Code Online (Sandbox Code Playgroud)

java collections java-8 java-stream

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

如何使用流来展平和分组此HashMap?

给定字母到数字的映射,我想返回一个字符串列表,其中每个字符串都是以逗号分隔的列表,这些列表按字母的关联编号分组。

对于这张地图

    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("A", 1);
    map.put("B", 2);
    map.put("C", 4);
    map.put("D", 1);
    map.put("E", 1);
    map.put("F", 2);
Run Code Online (Sandbox Code Playgroud)

我想返回一个包含以下内容的列表:

"A,D,E" "B,F", "C"
Run Code Online (Sandbox Code Playgroud)

有什么建议可以使用1.8流功能实现吗?

java java-8 java-stream

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

使用DateTimeFormatter解析模式为“ dd MMMMM uuuu”的日期

为什么这段代码给我一个异常?

String myFormat = "dd MMMMM uuuu";
String dateToFormat = "26 Mai 2010";
DateTimeFormatter myFormatter = new DateTimeFormatterBuilder().appendPattern(myFormat)
            .toFormatter().withResolverStyle(ResolverStyle.STRICT);
LocalDate myDate=LocalDate.parse(dateToFormat,myFormatter);
Run Code Online (Sandbox Code Playgroud)

例外:

java.time.format.DateTimeParseException: Text '26 Mai 2010' could not be parsed at index 4
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.LocalDate.parse(LocalDate.java:400)
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用“ MMMM”而不是“ MMMMM”,它将按预期工作。

String myFormat = "dd MMMM uuuu";
Run Code Online (Sandbox Code Playgroud)

java date-parsing java-8

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

如何在Java 8(Scala)中将日期时间字符串转换为长(UNIX纪元时间)毫秒

这个问题解决了几秒钟的情况:如何在Java 8(Scala)中将日期时间字符串转换为long(UNIX Epoch Time)

但是,如果我想要毫秒,似乎必须使用

def dateTimeStringToEpoch(s: String, pattern: String): Long = 
    LocalDateTime.parse(s, DateTimeFormatter.ofPattern(pattern))
      .atZone(ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0)))
      .toInstant().toEpochMilli
Run Code Online (Sandbox Code Playgroud)

这对于我在另一个问题中详细介绍的4个问题是很丑陋的(我不喜欢的主要内容是魔术文字"UTC"和魔术数字0)。

不幸的是以下内容无法编译

def dateTimeStringToEpoch(s: String, pattern: String): Long = 
     LocalDateTime.parse(s, DateTimeFormatter.ofPattern(pattern))
                  .toEpochMilliSecond(ZoneOffset.UTC)
Run Code Online (Sandbox Code Playgroud)

toEpochMilliSecond不存在

java datetime scala epoch java-8

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

Java8:按键将流收集到SortedMap中

我想将流收集到Map中,其中的键已排序,所以我尝试了:

TreeMap<LocalDate, MenuChart2.Statistics> last3MPerDay =    

                menuPriceByDayService.findAllOrderByUpdateDate(menu, DateUtils.quarterlyDate(), 92)
                .stream()
                .sorted(comparing(MenuPriceByDay::getUpdateDate))
                .collect(Collectors
                        .toMap(MenuPriceByDay::getUpdateLocalDate, p -> new MenuChart2().new Statistics( p.getMinPrice().doubleValue(), 
Run Code Online (Sandbox Code Playgroud)

但是我遇到了编译错误

Type mismatch: cannot convert from Map<LocalDate,Object> to 
 TreeMap<LocalDate,MenuChart2.Statistics>
Run Code Online (Sandbox Code Playgroud)

java collections functional-programming java-8 java-stream

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

无法使用季度从TemporalAccessor获取LocalDate

我试图将一些日期字符串解析为日期值,但是,使用下面的代码,我遇到了异常:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("Q'Q'uuuu - MMM");

String d = "3Q2016 - Aug";
System.out.println(LocalDate.parse(d, formatter));
Run Code Online (Sandbox Code Playgroud)

下面是例外

java.time.format.DateTimeParseException: Text '3Q2016 - Aug' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {MonthOfYear=8, QuarterOfYear=3, Year=2016},ISO of type java.time.format.Parsed
Run Code Online (Sandbox Code Playgroud)

查看异常,我看到了正确的数据,但是由于某种原因无法对其进行解析。

我看到的其他类似主题建议使用LocalDate或LocalDateTime,但均无效。

java datetime java-8

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

终端操作以评估中间操作

假设我有一个字符串列表,我想将这些字符串用作流利的构建器的输入。

List<String> scripts;

//initialize list

ScriptRunnerBuilder scriptRunnerBuilder = new ScriptRunnerBuilder();

BiFunction<String,ScriptRunnerBuilder,ScriptRunnerBuilder> addScript = 
(script,builder) -> builer.addScript(script);

scriptRunnerBuilder = scripts.stream.map(script -> 
addScript.apply(script,scriptRunnerBuilder)).......

scriptRunnerBuilder.build();
Run Code Online (Sandbox Code Playgroud)

我可以使用哪个终端操作,以便对列表中的所有元素调用addScript函数?

问题在于ScriptRunnerBuilder是不可变的,因此ScriptRunnerBuilder.addScript()返回新的ScriptRunnerBuilder对象,而不是修改现有对象-因此,我不能只是一个foreach。

我的意图是携带addScript()调用的结果,并将其用作流中下一个元素的输入

java java-8 java-stream

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

比较两个映射的键并返回布尔值

我有两个地图,我需要检查两者是否具有相同的键和相同的键数,并返回一个布尔值。我想为此使用流,我得到的是通过创建另一个列表

mapA
.entrySet()
.stream()
.filter(entry -> mapB.containsKey(entry.getKey()))
.collect(
    Collectors.toMap(Entry::getKey, Entry::getValue));
Run Code Online (Sandbox Code Playgroud)

但是我的问题是,我可以在一行中执行此操作吗?它不会创建另一个列表,但是会返回一个布尔值,无论它们是否相同。

java lambda java-8 java-stream

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

哪种方法可以对嵌套对象列表进行分叉?java 8 flatmap vs每个?

我有一个Terminal对象:

class Terminal{

    List<TerminalPeriodApplicability> periods= new ArrayList<>();
    //few other attributes

    //getters & setters

}

Run Code Online (Sandbox Code Playgroud)

TerminalPeriodApplicability 宾语:

class TerminalPeriodApplicability{

    String name;
    boolean isRequired;
    //getters & setters
}
Run Code Online (Sandbox Code Playgroud)

我想根据的值TerminalPeriodApplicabilityoptionalmandatory Set的名称分为两类isRequired

我尝试了两种方法。一个与两个forEach,另一个与flatMap

List<Terminal> terminals= getTerminals();
Set<String> mandatoryPeriods = new HashSet<>();
Set<String> optionalPeriods = new HashSet<>();
Run Code Online (Sandbox Code Playgroud)

方法1

terminals.forEach(terminal -> terminal.getApplicablePeriods().forEach(period->{
    if(period.getIsRequired())
        mandatoryPeriods.add(period.name());
    else
        optionalPeriods.add(period.name());
}));
Run Code Online (Sandbox Code Playgroud)

方法二:

List<TerminalPeriodApplicability> applicablePeriods = terminals
                .stream()
                .flatMap(terminal -> terminal.getApplicablePeriods().stream())
                .collect(Collectors.toList());

applicablePeriods.forEach(period->{
    if(period.getIsRequired())
        mandatoryPeriods.add(period.name());
    else …
Run Code Online (Sandbox Code Playgroud)

java foreach java-8 java-stream

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

如果在Java 8中stream之前collection为null,如何返回false?

我写了下面的代码来检查某些情况。

/**
 * Returns true if any of the dose detail is an x
 * @return boolean
 */
public <DD extends BD<DI>, DI extends BI> boolean Y(final Collection<DD> dds) {
    return dds.stream().anyMatch(dd -> dd.M().K());
}
Run Code Online (Sandbox Code Playgroud)

但是此方法有一些风险dds,为空。我需要返回false也是dd也为null。如何使用Java 8将此方法修改为null安全?

java collections java-8 java-stream

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