标签: java-stream

Java流:flatMap返回对象流

我有这个代码:

List<Application> applications = this.applicationDao.findAll();
Collection<Pair<Application, FileObject>> files = applications.stream()
    .flatMap(app -> streamOfFiles.map(file -> Pair.of(app, file)));
Run Code Online (Sandbox Code Playgroud)

这里streamOfFiles是一个Stream<FileObject>

目前,我收到此编译消息:

类型不匹配:无法转换Stream<Object>为Collection<Pair<Application,FileObject>>

有任何想法吗?

java java-stream

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

Kotlin如何在Kotlin中使用Java Streams .map()映射不同的对象响应

我试图将一个对象数组映射到具有不同类型对象的另一个数组,我曾经在Java 8中使用流来做到这一点,这很简单,实例化一个对象设置其值并返回该对象。我刚切换到Kotlin,实际上有时候做这种操作更令人困惑。我发现的所有示例都非常简单,找不到我想要的东西。

我有这个BalanceMap类:

data class BalanceMap @JsonCreator constructor( var balType: String, var value: Any )

我正在从Web服务获取数据。

val balances: List<AcctBal> = res.getAcctBals();
Run Code Online (Sandbox Code Playgroud)

AcctBal类如下所示

public class AcctBal {

  @SerializedName("CurAmt")
  @Expose
  private CurAmt curAmt;

  @SerializedName("Desc")
  @Expose
  private String desc;

  @SerializedName("ExpDt")
  @Expose
  private LocalDateTime expDt;
}
Run Code Online (Sandbox Code Playgroud)

并尝试将该响应映射到 var balanceList: List<BalanceMap>

balances.map {}
Run Code Online (Sandbox Code Playgroud)

-> var balanceList: List<BalanceMap> = balances.map { t -> fun AcctBal.toBalanceMap() = BalanceMap( balType = "", value = "" )}

我想做这样的事情:

List<ProductDetail> details = acctBal.stream().filter(f -> f.getBalType() != null).map(e -> {
                String …
Run Code Online (Sandbox Code Playgroud)

java-8 kotlin java-stream

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

如何将包含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
查看次数

Java Streams方法不影响我的ArrayList?

我正在尝试在名为的ArrayList上执行以下流操作parts:

parts
    .stream()
    .map(t -> t.toLowerCase())
    .distinct()
    .sorted()
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

其中parts包含这样的字符串:

Adventures
in
Disneyland
Two
blondes
were
going
to
Disneyland
....
Run Code Online (Sandbox Code Playgroud)

除了查看调试器之外,parts根本没有改变.不确定我是否错过了这个过程的一些步骤?

java arraylist java-stream

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

如何使用流来展平和分组此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
查看次数

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
查看次数

终端操作以评估中间操作

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

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方法

我有一系列的Java方法,所有的外观,除了不同的类象一样Class1Number,Class2Number,Class3Number等如下实施。有什么方法可以编写一个将类作为参数的方法?

Set<String> trimClass1NumberList(Set<String> criteria){
    Set<String> validData = new HashSet<>();
    Set<Class1Number> numberList = criteria.stream().map(String::trim).map(Class1Number::valueOf)
        .filter(Class1Number::isWellformed).collect(Collectors.toSet());
    for (Class1Number num : numberList) {
        // Do somehing with validData
    }
    return validData;
}

Set<String> trimClass2NumberList(Set<String> criteria){
    Set<String> validData = new HashSet<>();
    Set<Class2Number> numberList = criteria.stream().map(String::trim).map(Class2Number::valueOf)
        .filter(Class2Number::isWellformed).collect(Collectors.toSet());
    for (Class2Number num : numberList) {
        // Do somehing with validData
    }
    return validData;
}
Run Code Online (Sandbox Code Playgroud)

java java-stream

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

哪种方法可以对嵌套对象列表进行分叉?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)

我想根据的值TerminalPeriodApplicability将optional&mandatory 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
查看次数