小编GBl*_*ett的帖子

如何在Java 8中引用reduce()操作的结果?

我试图mkString在Java8中编写一个函数,一个Scala是有用的,mkString并遇到了两个问题,我可以使用一些帮助:

  1. 我无法创建mkString泛型Collection引用的第一个参数,Collection<Object> c并且让调用者使用任何类型的集合调用.

  2. 无法引用内联返回的结果reduce()来访问结果的长度以删除额外的前导分隔符.

这是代码:

public static void main(String[] args) {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    System.out.println(mkString(numbers, ","));

}

public static String mkString(Collection<Integer> c, String sep) {
    return c.stream()
            .map(e -> String.valueOf(e))
            .reduce("", (a, b) -> a + sep + b)
            .substring(1, <<>>.length);
}
Run Code Online (Sandbox Code Playgroud)

java reduce lambda scala java-stream

11
推荐指数
2
解决办法
358
查看次数

如何使用null检查连续生成java 8 Stream映射

我有这段代码

Coverage mainCoverage = illus.getLifes().stream()
    .filter(Life::isIsmain)
    .findFirst()
    .orElseThrow(() -> new ServiceInvalidAgurmentGeneraliException(env.getProperty("MSG_002")))
    .getCoverages()  
    .stream() // <==may cause null here if list coverage is null
    .filter(Coverage::isMainplan)
    .findFirst()
    .orElseThrow(() -> new ServiceInvalidAgurmentGeneraliException(env.getProperty("MSG_002")));
Run Code Online (Sandbox Code Playgroud)

这完全可以正常工作,但我认为它有点乱,并没有涵盖所有null pointer exception可能的(见评论).

我尝试将此代码重构为

Coverage mainCoverage1 = illus.getLifes().stream()
    .filter(Life::isIsmain)
    .map(Life::getCoverages)
    .filter(Coverage::isMainplan) //<== cannot filter from list coverage to one main coverage
    ...
Run Code Online (Sandbox Code Playgroud)

在我将生命映射到覆盖范围后,它似乎不再是一个覆盖列表.所以问题是如何将第一部分重构为null安全并且可能缩短它?

java java-8 java-stream

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

在 Java 中折叠顺序流

我习惯于在 Scala 中编程,但我必须编写一些 Java,并且我正在尝试执行以下 Scala 代码段的等效操作:

trait Options[K, V] {
  def add(key: K , value: V): Options[K, V]
}

val options: Options[T, U] = ???
val elems: List[(T, U)] = ???
elems.foldLeft(options) {
  case (opts, (key, value)) => opts.add(key, value)
}
Run Code Online (Sandbox Code Playgroud)

也就是说,我在elemsinside折叠元素options,在每一步生成一个新实例。

我尝试使用 Java 的Stream#reduce

interface Options<K, V> {
  Options<K, V> add(K key, V value);
}

Options<K, V> options = ???
Stream<Tuple2<K, V>> elems = ??? // This is Reactor's Tuple2
elems.reduce(options, (opts, opt) …
Run Code Online (Sandbox Code Playgroud)

java reduce functional-programming fold java-stream

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

Mapstruct 将布尔值映射到字符串

我的模型类中有几个Boolean字段(源)。我的 DTO 类中的目标字段是String. 我需要映射trueasYfalseas N。有超过 20 个Boolean字段,现在我正在使用 20 多个@Mapping带有expression选项的注释,这是开销。一定有一个我不知道的简单方法或解决方案。任何人都可以帮助简化这个吗?

我正在使用mapstruct版本1.2.0.Final

源码.java

class Source{
  private Boolean isNew;
  private Boolean anyRestriction;
  // several Boolean fields
}
Run Code Online (Sandbox Code Playgroud)

目标.java

class Target{
  private String isNew;
  private String anyRestriction;
}
Run Code Online (Sandbox Code Playgroud)

助手.java

class Helper{
  public String asString(Boolean b){
    return b==null ? "N" : (b ? "Y" : "N");
  }
}
Run Code Online (Sandbox Code Playgroud)

MyMapper.java

@Mapper interface MyMapper{
  @Mappings(
    @Mapping(target="isNew", expression="java(Helper.asString(s.isNew()))" …
Run Code Online (Sandbox Code Playgroud)

java string mapping boolean mapstruct

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

For循环不评估所有条目

这是我的代码:

import java.util.List;
import java.util.ArrayList;

public static void main(String[] args){

    List<Integer> possible = new ArrayList<Integer>();

    for(int i=0; i<1000000; i++){
        possible.add(i);
    }

    for(int i: possible){
        System.out.println(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望输出打印值从0到999,999,中间有空格.但是,我的输出是:

208
850209
850210
850211... all the way to 999999
Run Code Online (Sandbox Code Playgroud)

为什么我的for循环跳过数十万个值?我尝试用long和替换int double.两者都在运行时跳过值.有帮助吗?我只是想创建一个ArrayList从0到999,999的值.

java for-loop arraylist

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

使用多个过滤器的Java Stream搜索列表

我有一个Java对象列表(假设getter和setter):

Record(String name, String part, String value);
Run Code Online (Sandbox Code Playgroud)

如果列表包含某个name值和某个值,我需要返回一个布尔part值.

我让它一次为一个过滤器工作:

//assume records are added to this list
List<Record> masterList = new ArrayList<Record>();

boolean check = masterList.stream().map(Record::getName).filter(record.getName()::equals).findFirst().isPresent();
Run Code Online (Sandbox Code Playgroud)

但我得到的错误Non-static method cannot be referenced from a static contextRecord::getPart此尝试:

masterList.stream().map(Record::getName).filter(record.getName()::equals).map(Record::getPart).filter(record.getPart()::equals).findFirst().isPresent();
Run Code Online (Sandbox Code Playgroud)

java java-stream

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

流内不同数字类型的转换/比较

我再次遇到Stream API的问题.我试图实现的功能并不是最困难的事情,但由于存在不兼容的类型而我无法过滤,因此我不知道如何使比较正确.这个想法是获取有关给定部分链接到的部门的信息.

department.getSectionId()返回Longwhile Section::getIdInteger(我无法更改)

private List<DepartmentInfo> retrieveLinkedDepartments(final Collection<Section> sections) {
        return this.departmentDao
                .findAll()
                .stream()
                .filter(department -> department.getSectionId() != null)
                .filter(department -> department.getSectionId().equals(sections.stream().map(Section::getId)))                                           
                .map(this.departmentInfoMapper::map)
                .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

当然,主谓词的结果总是错误的.我知道代码很糟糕,而且我没有正确定义条件,但我希望你能得到这个想法.也许有可能以某种方式合并这些集合或以聪明的方式进行比较.

先感谢您!

java collections java-stream

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

IntelliJIdea:HashMap 调试窗口未显示与链表相关的完整详细信息

我的简单 java 代码如下所示:

String s1 = "FB";

String s2 = "Ea";

System.out.println(s1.hashCode() == s2.hashCode()); // true

Map<String, Integer> map = new HashMap<>();

map.put(s1, 1);

map.put(s2, 2);
Run Code Online (Sandbox Code Playgroud)

虽然调试这段代码在IntelliJIdea,我不能看到HashMap的数据结构中创建的链接列表,另外,还创建了两个桶,而不是一个虽然哈希码是相同的s1s2。能否请您澄清一下?

java intellij-idea

3
推荐指数
2
解决办法
1218
查看次数

为什么编译器无法识别我的返回语句?

我有以下代码块:

public static boolean isReverse (String s1, String s2) {    
    if((s1.length()==1)&&s2.length()==1) {          
        if(s1.equals(s2)) {             
            return true;
        }
    }       
    else if(s1.charAt(0)==s2.charAt(s2.length()-1)) {           
        return isReverse(s1.substring(1, s1.length()-1),s2.substring(0, s2.length()-2));
    }       
    else return false;  
}
Run Code Online (Sandbox Code Playgroud)

我理解通常你需要一个return语句来涵盖if语句都不成立的可能性.这就是为什么我有else return false最后,但我仍然得到错误"必须返回类型布尔的结果".以下是我使用它的电话:

public static void main(String[] args) {
    if(isReverse("Java", "avaJ")) {
        System.out.println("worked");
    }
}
Run Code Online (Sandbox Code Playgroud)

java string methods logic boolean

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

Java中的长字面量

因此,通读文档会指出,如果声明一个以L结尾的int常量,它将改为读取long值。这是我的问题:这与将类型命名为很长的名称之间有什么区别吗?例如:

int x = 100L;
VS.
long x = 100;
Run Code Online (Sandbox Code Playgroud)

同样的事情?

java long-integer

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