我试图mkString在Java8中编写一个函数,一个Scala是有用的,mkString并遇到了两个问题,我可以使用一些帮助:
我无法创建mkString泛型Collection引用的第一个参数,Collection<Object> c并且让调用者使用任何类型的集合调用.
无法引用内联返回的结果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) 我有这段代码
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安全并且可能缩短它?
我习惯于在 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) 我的模型类中有几个Boolean字段(源)。我的 DTO 类中的目标字段是String. 我需要映射trueasY和falseas 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) 这是我的代码:
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对象列表(假设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 context在Record::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) 我再次遇到Stream API的问题.我试图实现的功能并不是最困难的事情,但由于存在不兼容的类型而我无法过滤,因此我不知道如何使比较正确.这个想法是获取有关给定部分链接到的部门的信息.
department.getSectionId()返回Longwhile Section::getId是Integer(我无法更改)
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 代码如下所示:
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的数据结构中创建的链接列表,另外,还创建了两个桶,而不是一个虽然哈希码是相同的s1和s2。能否请您澄清一下?
我有以下代码块:
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) 因此,通读文档会指出,如果声明一个以L结尾的int常量,它将改为读取long值。这是我的问题:这与将类型命名为很长的名称之间有什么区别吗?例如:
int x = 100L;
VS.
long x = 100;
Run Code Online (Sandbox Code Playgroud)
同样的事情?