stream 提取某字段_java8从list集合中取出某一属性的值的集合案例

 

List orderNoList=list.stream().map(Order::getOrderNo).collect(Collectors.toList());

 

 

 

https://blog.youkuaiyun.com/weixin_39702400/article/details/111895006

 

 

我就废话不多说了,大家还是直接看代码吧~

List list = new ArrayList();

Order o1 = new Order("1","MCS-2019-1123");

list.add(o1 );

Order o2= new Order("2","MCS-2019-1124");

list.add(o2);

Order o3= new Order("3","MCS-2019-1125");

list.add(o3);

List orderNoList=list.stream().map(Order::getOrderNo).collect(Collectors.toList());

System.out.println("输出单号集合:"+orderNoList);

List idList=list.stream().map(Order::getId()).collect(Collectors.toList());

System.out.println(idList)

结果

输出第一个:

["MCS-2019-1123", "MCS-2019-1124", "MCS-2019-1125"]

[1, 2, 3]

order类:

public class Order{
String id;

String orderNo;

public Order(String id, String orderNo) {
this.id = id;

this.orderNo= orderNo;

}

public String getId() {
return id;

}

public void setId(String order) {
this.id= id;

}

public String getOrderNo() {
return orderNo;

}

public void setOrderNo(String message) {
this.orderNo= orderNo;

}

}

补充知识:java8快速对list集合的筛选计算取值总结

在我们日常开发过程中,有很多场景需要对list集合进行取值筛选,以下是我对常用的一些知识点进行总结

首先,创建一个需要用到的对象,例如学生对象,有相关字段:姓名,年龄,性别

public class Student {
private String name;

private int age;

private String sex;

public Student( String name, int age,String sex) {
this.age = age;

this.name = name;

this.sex = sex;

}

public String getName() {
return name;

}

public void setName(String name) {
this.name = name;

}

public int getAge() {
return age;

}

public void setAge(int age) {
this.age = age;

}

public String getSex() {
return sex;

}

public void setSex(String sex) {
this.sex = sex;

}

}

其次,对这些字段属性进行赋值

Student s1 = new Student("小金",20,"女");

Student s2 = new Student("小宋",21,"女");

Student s3 = new Student("小张",25,"男");

Student s4 = new Student("小王",27,"男");

Student s5 = new Student("小王",30,"未知");

List list = new ArrayList<>();

list.add(s1);

list.add(s2);

list.add(s3);

list.add(s4);

list.add(s5);

1、遍历-foreach

使用stream流进行foreach遍历

list.stream().forEach(student->{
//处理逻辑,打印出所有学生的姓名

System.out.println(student.getName());

});

运行结果:

2、筛选list

filter函数的()里,应该放逻辑,判断条件,将符合条件的放到resultList中

代码如下,筛选集合中所有性别为女的学生

List resultList = list.stream().filter(student -> Objects.equals(student.getSex(),"女")).collect(Collectors.toList());

resultList.stream().forEach(student->{
System.out.println(student.getName());

});

运行结果:

3、list去重

根据性别去重

List unique = list.stream().collect(Collectors.collectingAndThen(

Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getSex))), ArrayList::new));

unique.stream().forEach(student->{
System.out.println(student.getName());

});

运行结果:

4、取出list集合对象中某一个属性

取出每个对象中的姓名组成一个新的集合

List listStr = list.stream().map(Student::getName).collect(Collectors.toList());

去重

List listNew = listStr .stream().map(Student::getName).distinct().collect(Collectors.toList());

运行结果:

5、list与map互转,并根据某一属性进行分组

list转map (下方studentMap运行会报错,因为作为key值,name不能重复,所以正式开发中应该使用唯一性id作为key值)

Map studentMap = list.stream().collect(Collectors.toMap(Student::getName, student -> student));

list转数组

String[] listStrs = list.stream()

.filter(e -> Objects.equals(e.getSex(), "男"))

.sorted(Comparator.comparing(Student::getName))

.map(Student::getName).toArray(String[]::new);

list转map并且分组

Map> listMap = list.stream().collect(Collectors.groupingBy(Student::getSex));

运行结果:

根据对象某些属性,进行分组

Map studentsMap= list.stream()

.collect(Collectors.groupingBy(f -> Arrays.asList(f.getAge),f.getSex())));

map转list

List collect = studentMap.values().stream().collect(Collectors.toList());

6、过滤属性为空的字段

Student s6 = new Student("",30,"男");

list.add(s6);

List stringList = list.stream().map(s -> s.getName()).filter(s -> !s.isEmpty()).collect(Collectors.toList());

7、根据某一属性进行计算

根据年龄求最大值、最小值、平均值、总和、个数

IntSummaryStatistics resultNum = list.stream().mapToInt((item)->item.getAge()).summaryStatistics();

System.out.println("max:"+resultNum.getMax());

System.out.println("min:"+resultNum.getMin());

System.out.println("sum:"+resultNum.getSum());

System.out.println("average:"+resultNum.getAverage());

System.out.println("count:"+resultNum.getCount());

运行结果:

注意:

1、求和有三种类型,mapToInt,mapToLong,mapToDouble

2、如果是Bigdecimal数值类型,则计算方法如下,(新建对象)

Frult frult1 = new Frult("西瓜",new BigDecimal(1));

Frult frult2 = new Frult("梨子",new BigDecimal(2));

List frultList = new ArrayList<>();

frultList.add(frult1);

frultList.add(frult2);

BigDecimal totalPrice = frultList.stream().map(Frult::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);

//或者用mapToInt()进行强转(int->Bigdecimal)

结语:本人目前用到这么多,希望各位有更好的或者其它的用法给予建议与评论,有错误也希望能得到指正!也希望大家多多支持龙方网络。
————————————————
版权声明:本文为优快云博主「weixin_39702400」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_39702400/article/details/111895006

 

 

 

 

 

 

 

 

<think>嗯,用户问的是在UE中使用UMG进行文本换行。首先,我需要回忆下UMG里的文本控件。UMG主要有Text Block和Editable Text Box两种控件,用户可能用的是Text Block,因为通常显示静态文本会用这个。那换行的话,可能有几种方法。 第种方法是直接在字符串里加换行符,比如用\n。不过用户可能在输入的时候需要按住Shift+Enter才能换行,或者直接在文本属性里输入\n。这时候要注意,如果文本是直接在UMG设计器里输入的,可能需要用转义字符,比如在蓝图中可能需要用双引号包裹或者用其他方式。 第二种方法是设置自动换行。Text Block有个Auto Wrap Text的选项,启用之后可以设置Wrap Text At的宽度,这样文本超过这个宽度就会自动换行。这应该是最常用的方法,用户可能不知道这个选项的存在,或者不知道怎么用。需要详细说明步骤,比如在属性面板中找到这个选项,启用并调整数。 第三种情况是动态生成文本时,比如从数据表或者变量获文本内容,这时候可能需要用C++或者蓝图来插入换行符。例如在蓝图中拼接字符串时,用Append节点加上\n,或者在C++中使用FString::Printf来插入换行符。 然后要检查引用的内容是否有相关的信息。用户提供的引用里,引用[3]提到修复了Object Library的问题,但可能和UMG无关。引用[1]和[2]是关于声音节点和行为树的,可能也不太相关。不过还是要确认是否有更新影响到文本处理,比如是否某些版本中换行符的处理方式有变化,或者新增了自动换行的功能。但根据现有信息,可能不需要引用这些内容,但可以提到确保引擎版本更新到最新以避免已知问题。 用户可能的真实需求是希望在UI中正确显示长文本,避免溢出。可能需要提醒他们测试不同分辨率和字体大小下的显示效果,确保自动换行正常工作。另外,如果有使用富文本的情况,比如Rich Text Block,换行的处理方式可能不同,但用户问的是普通Text Block,所以可以暂不涉及。 总结回答的结构:分点说明手动换行、自动换行、动态生成文本的方法,并给出示例和注意事项。确保提到蓝图和C++的实现方式,以及可能遇到的常见问题,比如换行符未生效的情况,需要检查是否启用了自动换行或者是否正确使用了转义字符。</think>在Unreal Engine中使用UMG实现文本换行可通过以下三种方式实现: ### 、手动换行符插入 1. 在Text Block的文本属性中直接输入换行符 2. 使用`\n`转义字符作为换行标记 3. 示例代码: ```cpp FString MyText = TEXT("第行\n第二行"); TextWidget->SetText(FText::FromString(MyText)); ``` ### 二、自动换行设置 1. 在UMG编辑器中选中Text Block 2. 属性面板启用`Auto Wrap Text`选项 3. 设置`Wrap Text At`参数(单位:像素),如: ```python # 伪代码表示属性设置逻辑 TextBlock.AutoWrap = True TextBlock.WrapWidth = 300 ``` 当文本宽度超过设定时自动换行,该功能特别适用于动态文本内容[^2]。 ### 三、富文本格式 使用Rich Text Block控件时: 1. 通过`<br>`标签实现换行 2. 示例: ```xml <TextBlock> <RichTextBlock.Text> <![CDATA[第行<br>第二行]]> </RichTextBlock.Text> </TextBlock> ``` **注意事项**: - 需要确保字体资源包含必要字符集 - 多语言版本中换行位置可能需要单独调整 - 自动换行在复杂文字系统(如阿拉伯语)中表现可能不同 相关问题
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值