Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象, 是一个来自数据源的元素队列并支持聚合操作(https://upload-images.jianshu.io/upload_images/6348370-f8218715507512e1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Stream 可以对集合和数组进行一些简化操作,将集合或数组转化为Stream流,使用Stream流中的方法对集合/数组
中的元素进行操作,解决集合中的一些弊端
和以前的Collection操作不同,Stream操作还有两个基础的特征
Pipelining:中间操作都会返回流对象本身,这样多个操作可以串联成一个管道,如果流式风格(fluent style),这样做可以对操作进行优化,比如延迟执行(laziness)和短路(short-circuiting)
内部迭代:以前对集合遍历都是通过Iterator或者增强for的方式,显示的在集合外部进行迭代,这叫做外部迭代,Stream提供了内部迭代的方式,流可以直接调用遍历方法
当使用一个流的时候,通常包括3个步骤:获取一个数据源(source) -> 数据转换 -> 执行操作获取想要的结果,每次转换原有Stream对象,返回一个新的Stream对象,这就允许对其操作可以向链条一样排列,变成一个管道
516E226E-0FFF-43E9-9283-779D9491EB38.png
Stream两种使用方法: 1.在java.util.Collection 中有一个方法 default Stream 2.java.util.stream接口的静态方法of可以获取数组对应的流 static Stream of (T... values)
List list = new ArrayList();
Stream stream1 = list.stream();
Set set = new HashSet();
Stream stream2 = set.stream();
Map map = new HashMap();
Set keySet= map.keySet();
Stream stream3 = keySet.stream();
Collection collection = map.values();
Stream stream4 = collection.stream();
// 获取键值对的映射关系
// Map.entrySet() 这个方法返回的是一个Set>,Map.Entry 是Map中的一个接口,他的用途是表示一个映射项(里面有Key和Value),
// 而Set>表示一个映射项的Set。Map.Entry里有相应的getKey和getValue方法,即JavaBean,让我们能够从一个项中取出Key和Value
Set> entries = map.entrySet();
Stream> stream = entries.stream();
// 数组转换为stream流
Integer[] arr = {1,2,3,4,5};
Stream stream5= Stream.of(arr);
package NewFeature.JavaStream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public static void main(String[] args) {
int[] list = IntStream.range(1, 10).map(i -> i*2).toArray();
for (int value: list) {
System.out.println(value);
}
// or
List result = IntStream.range(10, 20).map(i -> i*2).boxed().collect(Collectors.toList());
for (int value: result) {
System.out.println(value);
}
}
输出:
2
4
6
8
10
12
14
16
18
List list = Arrays.asList(1,2,2,3,4,2,1,5);
list.stream().filter(i -> i%2 == 0).distinct().forEach(System.out::println);
输出:
2
4
List list = new ArrayList();
list.add("张三丰");
list.add("马可波诺");
list.add("张小龙");
list.add("赵无极");
list.add("青龙");
list.add("乔峰");
List shortList = new ArrayList<>();
for (String name:list) {
if (name.length() == 3 && name.startsWith("张")) {
shortList.add(name);
}
}
System.out.println("张开头并且长度为2的名字=" + shortList.toString())
list.stream().filter(value -> value.startsWith("张"))
.filter(value -> value.length() == 3)
.collect(Collectors.toList()).forEach(System.out::print);
List list = Arrays.asList(2,5,6,6,8,2,12,63,53,13,76);
list.stream().filter(i -> i>5).
distinct().
limit(3).
// skip(1).
collect(Collectors.toList()).
forEach(System.out::println);
输出:
6
8
12
// 加了skip(1)
8
12
案例4: Stream支持map方法,接收一个函数作为参数,这个函数被应用到每个元素上,并将其映射成一个新元素
List list = Arrays.asList("wudy", "macBook", "china hello");
List wordLens = list.stream().map(String::length).collect(Collectors.toList());
for (Integer item:wordLens) {
System.out.println("长度=" + item);
}
输出:
长度=4
长度=7
长度=11
案例5:flatmap方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流
List list = Arrays.asList("Hello", "World");
list.stream().map(word -> word.split(""))
.flatMap(Arrays::stream)
.distinct()
.collect(Collectors.toList())
.forEach(System.out::print)
输出:
HeloWrd
如下图:
B6AC3DC1-1866-434E-AF24-A4A6FA232579.png
-案例6:给定两个数字列表,返回所有的数对?例如:给定列表[1,3]、[2,4,6], 应该返回[(1,2),(1,4),(1,6),(3,2),(3,4),(3,6)]
List list1 = Arrays.asList(1,3);
List list2 = Arrays.asList(2,4,6);
List pairs = list1.stream().flatMap(i -> list2.stream()
.map(j -> new int[] {i, j}))
.collect(Collectors.toList());
// pairs.stream().forEach(item -> Arrays.stream(item).forEach();
for (int [] item: pairs) {
System.out.println(Arrays.toString(item));
}
输出:
[1, 2]
[1, 4]
[1, 6]
[3, 2]
[3, 4]
[3, 6]
List list = Arrays.asList("wudy","peter");
if (list.stream().anyMatch(value -> value.equals("peter"))) {
System.out.println("匹配到了给定的谓词");
}
输出:
匹配到了给定的谓词
List list = Arrays.asList(5,7,11,423,54);
if (list.stream().allMatch(value -> value > 3)) {
System.out.println("匹配了所有的谓词");
}
输出:
匹配了所有的谓词
List list = Arrays.asList(101,198,112,423,354);
if (list.stream().noneMatch(value -> value < 100)) {
System.out.println("都能活到100岁");
}
输出:
都能活到100岁
List list = Arrays.asList(1,2,3,4,5,6);
// Integer sum = list.stream().reduce(0, (a, b) -> a + b);
Integer sum = list.stream().reduce(0, Integer::sum);
System.out.println("sum=" + sum);
Integer max = list.stream().reduce(0, Integer::max);
System.out.println("max=" + max);
输出:
sum=21
max=6
案例11:现在有一个List集合,想对该集合中的数据分组处理
package NewFeature.JavaStream;
public class User {
private Integer id;
private Integer age;
private String name;
public User(Integer id, Integer age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
public Integer getId() {
return id;
}
public Integer getAge() {
return age;
}
public String getName() {
return name;
}
public void setId(Integer id) {
this.id = id;
}
public void setAge(Integer age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
package NewFeature.JavaStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 现在有一个List集合,想对该集合中的数据分组处理
*/
public class StreamDemo {
public static void main(String[] args) {
List list = getUserList();
Map> userGroupList = list.stream().collect(Collectors.groupingBy(User::getAge));
System.out.println(userGroupList);
// for (Integer key: userGroupList.keySet()) {
// System.out.println(userGroupList.get(key));
// }
//
// for (List value: userGroupList.values()) {
// System.out.println(value);
// }
}
public static ArrayList getUserList() {
User user1 = new User(1, 18, "wudy");
User user2 = new User(2, 20, "peter");
User user3 = new User(3, 30, "timo");
User user4 = new User(4, 20, "chimmy");
ArrayList arrayList = new ArrayList();
arrayList.add(user1);
arrayList.add(user2);
arrayList.add(user3);
arrayList.add(user4);
return arrayList;
}
}
输出:
{18=[NewFeature.JavaStream.User@5b6f7412], 20=[NewFeature.JavaStream.User@27973e9b, NewFeature.JavaStream.User@312b1dae], 30=[NewFeature.JavaStream.User@7530d0a]}
1.distinct() 对于 String 列表的去重
@Test
public void stream1(){
List list = new ArrayList<>();
list.add("A");
list.add("C");
list.add("B");
list.add("C");
System.out.println("去重前=" + list);
list = list.stream().distinct().collect(Collectors.toList());
System.out.println("去重后=" + list);
}
去重前=[A, C, B, C]
去重后=[A, C, B]
2.对实体类列表的去重
// 定义实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "message")
public class Message implements Serializable {
@ApiModelProperty(value = "用户司机企业的id")
private Long uid;
@ApiModelProperty(value = "客服id")
private String agentId;
@ApiModelProperty(value = "客服名称")
private String agentName;
}
// 实现类 MessageServiceImpl
package cn.huolala.llim.im.service.impl;
@Service
public class MessageServiceImpl extends ServiceImpl implements IMessageService {
@Autowired
private IMessageMapper iMessageMapper;
@Override
public List queryList(Message message, PageBO pager) {
// 多条件构造器
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper
.select("uid", "agent_id", "agent_name") // 查询指定字段
.isNotNull("uid").eq("uid", message.getUid());
queryWrapper.orderByDesc("created_at");
Page page = new Page<>(pager.getPage_no(), pager.getPage_size());
page = iMessageMapper.selectPage(page, queryWrapper);
return page.getRecords();
}
}
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;
@Test
public void stream() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
Message message = new Message();
message.setUid(113074491521L);
PageBO page = new PageBO();
page.setPage_no(1);
page.setPage_size(10);
// 1. 对于 Message 列表去重
List messageList = iMessageService.queryList(message, page);
System.out.println("去重前=" + messageList);
// System.out.println("writeValueAsString = " + objectMapper.writeValueAsString(messageList));
messageList = messageList.stream().distinct().collect(Collectors.toList());
System.out.println("去重后=" + messageList);
// System.out.println("writeValueAsString = " + objectMapper.writeValueAsString(messageList));
messageList = messageList.stream().collect(
collectingAndThen(
toCollection(() -> new TreeSet<>(Comparator.comparing(Message::getAgentId))), ArrayList::new)
);
System.out.println("根据agentID去重后=" + messageList);
}
<== Columns: uid, agent_id, agent_name
<== Row: 113074491521, 107, wudy.yu2
<== Row: 113074491521, 107, wudy.yu
<== Row: 113074491521, 108, wudy.yu3
<== Row: 113074491521, 107, wudy.yu
去重前=[Message(uid=113074491521, agentId=107, agentName=wudy.yu2), Message(uid=113074491521, agentId=107, agentName=wudy.yu), Message(uid=113074491521, agentId=108, agentName=wudy.yu3), Message(uid=113074491521, agentId=107, agentName=wudy.yu)]
去重后=[Message(uid=113074491521, agentId=107, agentName=wudy.yu2), Message(uid=113074491521, agentId=107, agentName=wudy.yu), Message(uid=113074491521, agentId=108, agentName=wudy.yu3)]
根据agentID去重后=[Message(uid=113074491521, agentId=107, agentName=wudy.yu2), Message(uid=113074491521, agentId=108, agentName=wudy.yu3)]
3.根据List中 Object 某个属性去重
// 见上例
messageList = messageList.stream().collect(
collectingAndThen(
toCollection(() -> new TreeSet<>(Comparator.comparing(Message::getAgentId))), ArrayList::new)
);
4.通过 filter() 方法
//我们首先创建一个方法作为 Stream.filter() 的参数,其返回类型为 Predicate,原理就是判断一个元素能否加入到 Set 中去,代码如下:
private static Predicate distinctByKey(Function keyExtractor){
Set seen = ConcurrentHashMap.newKeySet();
return t -> seen.add(keyExtractor.apply(t));
}
@Test
public void stream() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
Message message = new Message();
message.setUid(113074491521L);
PageBO page = new PageBO();
page.setPage_no(1);
page.setPage_size(10);
// 1. 对于 Message 列表去重
List messageList = iMessageService.queryList(message, page);
System.out.println("去重前=" + messageList);
messageList = messageList.stream().distinct().collect(Collectors.toList());
System.out.println("去重后=" + messageList);
//这里我们将 distinctByKey() 方法作为 filter() 的参数,过滤掉那些不能加入到 set 的元素
messageList = messageList.stream().filter(distinctByKey(Message::getAgentId)).collect(Collectors.toList());
System.out.println("根据agentID去重后=" + messageList);
}
<== Columns: uid, agent_id, agent_name
<== Row: 113074491521, 107, wudy.yu2
<== Row: 113074491521, 107, wudy.yu
<== Row: 113074491521, 108, wudy.yu3
<== Row: 113074491521, 107, wudy.yu
<== Total: 4
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1f6af096]
去重前=[Message(uid=113074491521, agentId=107, agentName=wudy.yu2), Message(uid=113074491521, agentId=107, agentName=wudy.yu), Message(uid=113074491521, agentId=108, agentName=wudy.yu3), Message(uid=113074491521, agentId=107, agentName=wudy.yu)]
去重后=[Message(uid=113074491521, agentId=107, agentName=wudy.yu2), Message(uid=113074491521, agentId=107, agentName=wudy.yu), Message(uid=113074491521, agentId=108, agentName=wudy.yu3)]
根据agentID去重后=[Message(uid=113074491521, agentId=107, agentName=wudy.yu2), Message(uid=113074491521, agentId=108, agentName=wudy.yu3)]
如果有一个需求,需要对数据库查询到的菜肴进行一个处理: 筛选出卡路里小于400的菜肴 对筛选出的菜肴进行一个排序 获取排序后菜肴的名字
public class Dish {
private String name;
private boolean vegetarian;
private int calories;
private Type type;
// getter and setter
}
// java8之前的实现方式
private List beforeJava7(List dishList) {
List lowCaloricDishes = new ArrayList<>();
//1.筛选出卡路里小于400的菜肴
for (Dish dish : dishList) {
if (dish.getCalories() < 400) {
lowCaloricDishes.add(dish);
}
}
//2.对筛选出的菜肴进行排序
Collections.sort(lowCaloricDishes, new Comparator() {
@Override
public int compare(Dish o1, Dish o2) {
return Integer.compare(o1.getCalories(), o2.getCalories());
}
});
//3.获取排序后菜肴的名字
List lowCaloricDishesName = new ArrayList<>();
for (Dish d : lowCaloricDishes) {
lowCaloricDishesName.add(d.getName());
}
return lowCaloricDishesName;
}
// java8之后的实现方式
private List afterJava8(List dishList) {
return dishList.stream()
.filter(d -> d.getCalories() < 400) //筛选出卡路里小于400的菜肴
.sorted(comparing(Dish::getCalories)) //根据卡路里进行排序
.map(Dish::getName) //提取菜肴名称
.collect(Collectors.toList()); //转换为List
}
高高兴兴写完需求这时候又有新需求了,新需求如下: 对数据库查询到的菜肴根据菜肴种类进行分类,返回一个Map>的结果 这要是放在jdk8之前肯定会头皮发麻
// java8之前的实现方式
private static Map> beforeJdk8(List dishList) {
Map> result = new HashMap<>();
for (Dish dish : dishList) {
//不存在则初始化
if (result.get(dish.getType())==null) {
List dishes = new ArrayList<>();
dishes.add(dish);
result.put(dish.getType(), dishes);
} else {
//存在则追加
result.get(dish.getType()).add(dish);
}
}
return result;
}
// java8的实现方式
private static Map> afterJdk8(List dishList) {
return dishList.stream().collect(groupingBy(Dish::getType));
}
一、什么是流? 流是从支持数据处理操作的源生成的元素序列,源可以是数组、文件、集合、函数。流不是集合元素,它不是数据结构并不保存数据,它的主要目的在于计算
二、如何生成流 生成流的方式主要有五种:
// 2.1>通过集合生成,应用中最常用的一种
List integerList = Arrays.asList(1, 2, 3, 4, 5);
Stream stream = integerList.stream();
// 2.2>通过集合的stream方法生成流
// 2.2.1> 通过数组生成
int[] intArr = new int[]{1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(intArr);
/*
通过Arrays.stream方法生成流,并且该方法生成的流是数值流【即IntStream】而不是Stream。
补充一点使用数值流可以避免计算过程中拆箱装箱,提高性能。Stream API提供了mapToInt、mapToDouble、mapToLong三种方式将对象流
【即Stream】转换成对应的数值流,同时提供了boxed方法将数值流转换为对象流
*/
// 2.2.2> 通过值生成
// 通过Stream的of方法生成流,通过Stream的empty方法可以生成一个空流
Stream stream = Stream.of(1, 2, 3, 4, 5);
// 2.3> 通过文件生成
// 通过Files.line方法得到一个流,并且得到的每个流是给定文件中的一行
Stream lines = Files.lines(Paths.get("data.txt"), Charset.defaultCharset())
//2.4> 通过函数生成
//提供了iterate和generate两个静态方法从函数中生成流
Stream stream = Stream.iterate(0, n -> n + 2).limit(5);
// iterate方法接受两个参数,第一个为初始化值,第二个为进行的函数操作,因为iterator生成的流为无限流,通过limit方法对流进行了截断,只生成5个偶数
Stream stream = Stream.generate(Math::random).limit(5);
//generate方法接受一个参数,方法参数类型为Supplier,
//由它为流提供值。generate生成的流也是无限流,因此通过limit对流进行了截断
流的操作类型主要分为两种: 1.中间操作 一个流可以后面跟随零个或多个中间操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的,仅仅调用到这类方法,并没有真正开始流的遍历,真正的遍历需等到终端操作时,常见的中间操作有下面即将介绍的filter、map等 2.终端操作 一个流有且只能有一个终端操作,当这个操作执行后,流就被关闭了,无法再被操作,因此一个流只能被遍历一次,若想在遍历需要通过源数据在生成流。终端操作的执行,才会真正开始流的遍历。如下面即将介绍的count、collect等
参考资料: https://mp.weixin.qq.com/s?__biz=MzUxOTc4NjEyMw==&mid=2247506967&idx=2&sn=c9c4b190331dc53faf77f8185e9fd534&chksm=f9f6c7f3ce814ee59109d3f2496eae5feaa46ef09fbc098e2c0d02be591fdeb043a3389c0cbc&mpshare=1&scene=23&srcid=0427RZolHIHFZHAY2n3NoRkE&sharer_sharetime=1619505638932&sharer_shareid=f770d25bc57f1c2f9159f85750f854dc#rd
1.Stream的distinct方法 distinct()
是Java 8 中 Stream
提供的方法,返回的是由该流中不同元素组成的流。distinct()使用 hashCode()
和 eqauls()
方法来获取不同的元素。 因此,需要去重的类必须实现 hashCode()
和 equals()
方法。换句话讲,我们可以通过重写定制的 hashCode()
和equals()
方法来达到某些特殊需求的去重。 distinct()
方法声明如下:
1.1 对String列表去重: 因为 String 类已经覆写了 equals() 和 hashCode() 方法,所以可以去重成功
@Test
public void distinct(){
List stringList = new ArrayList(){
{
add("A");
add("B");
add("C");
add("A");
}
};
System.out.println("去重前:");
for (String s : stringList){
System.out.println(s);
}
stringList = stringList.stream().distinct().collect(Collectors.toList());
System.out.println("去重后:");
for (String s : stringList){
System.out.println(s);
}
}
去重前: A B C A 去重后: A B C
1.2 对实体类列表的去重 注:代码中我们使用了 Lombok
插件的 @Data
注解,可自动覆写 equals()
以及 hashCode()
方法
@Test
public void distinct() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
List sList = new ArrayList<>();
Student s1 = Student.builder().stuNo("001").name("wudy").build();
Student s2 = Student.builder().stuNo("002").name("peter").build();
Student s3 = Student.builder().stuNo("001").name("wudy").build();
sList.add(s1);
sList.add(s2);
sList.add(s3);
System.out.printf("去重前:" + mapper.writeValueAsString(sList));
sList = sList.stream().distinct().collect(Collectors.toList());
System.out.printf("去重后:" + mapper.writeValueAsString(sList));
}
去重前:[{"stuNo":"001","name":"Tom"},{"stuNo":"002","name":"Mike"},{"stuNo":"001","name":"Tom"}] 去重后:[{"stuNo":"001","name":"Tom"},{"stuNo":"002","name":"Mike"}]
1.3 根据List中Object某个属性去重
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;
@Test
public void test21() throws JsonProcessingException {
List list = new ArrayList<>();
Student s1 = Student.builder().stuNo("001").stuName("wudy").build();
Student s2 = Student.builder().stuNo("002").stuName("peter").build();
Student s3 = Student.builder().stuNo("001").stuName("wudy").build();
list.add(s1);
list.add(s2);
list.add(s3);
ObjectMapper mapper = new ObjectMapper();
System.out.printf("去重前=" + mapper.writeValueAsString(list));
list = list.stream().collect(
collectingAndThen(
toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getStuName))), ArrayList::new)
);
System.out.printf("去重后=" + mapper.writeValueAsString(list));
}
去重前=[{"stuName":"wudy","stuNo":"001"},{"stuName":"peter","stuNo":"002"},{"stuName":"wudy","stuNo":"001"}] 去重后=[{"stuName":"peter","stuNo":"002"},{"stuName":"wudy","stuNo":"001"}]
@Test
public void test21() throws JsonProcessingException {
List list = new ArrayList<>();
Student s1 = Student.builder().stuNo("001").stuName("wudy").build();
Student s2 = Student.builder().stuNo("002").stuName("peter").build();
Student s3 = Student.builder().stuNo("001").stuName("wudy").build();
list.add(s1);
list.add(s2);
list.add(s3);
ObjectMapper mapper = new ObjectMapper();
System.out.printf("去重前=" + mapper.writeValueAsString(list));
// 将 distinctByKey() 方法作为 filter() 的参数,过滤掉那些不能加入到 set 的元素
list = list.stream().filter(dictinctByKey(Student::getStuName)).collect(Collectors.toList());
System.out.printf("去重后=" + mapper.writeValueAsString(list));
}
private static Predicate dictinctByKey(Function keyExtractor){
Set keys = ConcurrentHashMap.newKeySet();
return t -> keys.add(keyExtractor.apply(t));
}
去重前=[{"stuName":"wudy","stuNo":"001"},{"stuName":"peter","stuNo":"002"},{"stuName":"wudy","stuNo":"001"}] 去重后=[{"stuName":"wudy","stuNo":"001"},{"stuName":"peter","stuNo":"002"}]
Stream
将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等
Stream可以由数组或集合创建,对流的操作分为两种:
中间操作,每次返回一个新的流,可以有多个。
终端操作,每个流只能进行一次终端操作,终端操作结束后流无法再次使用。终端操作会产生一个新的集合或值。
另外,Stream有几个特性:
stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果。
stream不会改变数据源,通常情况下会产生一个新的集合或一个值。
stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。
1.Stream创建: 1.1> Stream可以通过集合数组创建,通过 java.util.Collection.stream() 方法用集合创建流
List list = Arrays.asList("a", "b", "c");
// 创建一个顺序流
Stream stream = list.stream();
// 创建一个并行流
Stream parallelStream = list.parallelStream();
1.2> 使用java.util.Arrays.stream(T[] array)方法用数组创建流
int[] array={1,3,5,6,8};
IntStream stream = Arrays.stream(array);
1.3> 使用Stream的静态方法:of()、iterate()、generate()
Stream stream = Stream.of(1, 2, 3, 4, 5, 6);
Stream stream2 = Stream.iterate(0, (x) -> x + 3).limit(4);
stream2.forEach(System.out::println); // 0 2 4 6 8 10
Stream stream3 = Stream.generate(Math::random).limit(3);
stream3.forEach(System.out::println);
stream
和parallelStream
的简单区分: stream
是顺序流
,由主线程按顺序对流执行操作,而parallelStream
是并行流
,内部以多线程
并行执行的方式对流进行操作,但前提是流中的数据处理没有顺序要求。例如筛选集合中的奇数,两者的处理不同之处
https://mp.weixin.qq.com/s?__biz=MzUxOTc4NjEyMw==&mid=2247533024&idx=3&sn=393d7130c992ab67d5ce2dde66b165dc&chksm=f9f65a04ce81d312c3edc482d796f68b250e9bca943c77ce10e36e16e6a3c0850f10d58a7c24&mpshare=1&scene=23&srcid=0521nfdgr7cnkMhqRtFFGqz2&sharer_sharetime=1653147530521&sharer_shareid=7fec9c1809ccb850bfdebba7d4f7a81e%23rd
// 1.list => 数组
List arrayList = new ArrayList(Arrays.asList(1,3,5,7,9));
// int[] arr = arrayList.stream().mapToInt((item) -> Integer.valueOf(item)).toArray();
int[] arr = arrayList.stream().mapToInt(Integer::intValue).toArray();
for (int i=0;i list
int[] arr2 = {2,4,6,8};
List list = Arrays.stream(arr2).boxed().collect(Collectors.toList());
for (Integer item: list) {
System.out.println(" item="+ item);
}
// 3.统计数组中的元素
String[] arr3 = {" a",="" "c",="" "a",="" "b",="" "d",="" "c"};="" 第一个参数代表将arr中的每一个元素作为map中的key,第二个参数代表每一个key所对应的value,在这里每一个元素都对应个数1,第三个参数代表,如果存在相同的key,该如何进行合并,这里通过使用integer::sum,代表将具有相同key的元素进行合并时,其value进行相加="" stream.of(arr3).collect(collectors.tomap(k="" -=""> k, k -> 1, Integer::sum))
.forEach((k, v) -> System.out.println(k + ": " + v));
// 4.基本数据类型的数组自定义排序
int[] arr4 = {1, 5, 9, 7, 2, 3, 7, -1, 0, 3};
int[] arr5 = IntStream.of(arr4).boxed()
.sorted(Comparator.reverseOrder())
.mapToInt(Integer::intValue)
.toArray();
for (Integer item:arr5) {
System.out.println("item5="+ item);
}
// 5.统计数组中前 k 个个高频元素
int[] arr6 = {1,3,2,55,33,3,6,1,55,3,2,0,98,3,1,41,52,2,1,3};
int[] arr7 = Arrays.stream(arr6)
.boxed()
.collect(Collectors.toMap(e -> e, e -> 1, Integer::sum))
.entrySet()
.stream()
.sorted((m1, m2) -> m2.getValue() - m1.getValue())
.limit(2)
.mapToInt(Map.Entry::getKey)
.toArray();
for (Integer item:arr7) {
System.out.println("item7="+ item);
}
你可能感兴趣的:(java之Stream的常见用法)
前端怎么实现聊天输入框?怎么实现类似b站评论的输入并发送自定义表情包?输入回显、发送时表情包转义为[emoji]字符串、页面展示回显
旅行中的伊蕾娜
前端 javascript vue.js html5
之前做项目实现聊天功能,有几个功能点我觉得挺复杂的。今天我来说一下,我是如何实现图片小表情在输入框中显示,发送给后端时只发送一个含义字符串如:[emoji],然后正常回显在页面上。此demo使用vue3源码已上传:源码地址实现效果图:输入自定义表情发送并回显声明:这只是个demo,不涉及与后端交互,不过会在该交互的地方标记,如需实际应用于项目,请根据实际情况进行改造完善!父组件定义及逻辑实现父组件
python小函数
勉旃
Python学习
1、sum()sum()方法对系列进行求和计算。以下是sum()方法的语法:sum(iterable[,start])(iterable[,start])iterable--可迭代对象,如列表。start--指定相加的参数,如果没有设置这个值,默认为0。返回计算结果。以下展示了使用sum函数的实例:>>>sum([0,1,2])3>>>sum((2,3,4),1)#元组计算总和后再加110>>>s
跟我一起学Python数据处理(117/127):高级Python环境搭建指南
lilye66
python windows 开发语言
跟我一起学Python数据处理(117/127):高级Python环境搭建指南在Python数据处理的学习和实践中,基础的Python环境可能无法满足日益复杂的项目需求。就像我们搭建房子,简单的毛坯房能满足基本居住,但想要更舒适、功能更齐全,就需要精心装修一番。今天,我就和大家分享一下高级Python环境搭建的相关知识,希望能和大家一起在技术的道路上共同进步,让我们处理数据时更加得心应手。一、为什
【2025小白版】计算复试/保研机试模板(个人总结非GPT生成)附代码
数维学长986
计算机复试 复试 计算机 计算机机试 机试 复试机试
一、编程语言选择很多高校在机试中对编程语言都有明确规定,像复旦大学计算机学院就说明可选择C、C++或Java语言答题,还支持C11(gcc5.4),C++14(g++5.4),Java(openjdk1.8)等编译环境。这里强烈建议大家使用C/C++,因为几乎所有高校都支持,通用性超强。二、准备好模板是至关重要的一般来说,机试都可以带书和纸质资料进入考场。所以提前把那些函数的用法和算法的模板准备好
物理竞赛中的线性代数
yh2021SYXMZ
线性代数
线性代数1行列式1.1nnn阶行列式定义1.1.1:称以下的式子为一个nnn阶行列式:∣A∣=∣a11a12⋯a1na21a22⋯a2n⋮⋮⋱⋮an1an2⋯ann∣\begin{vmatrix}\mathbfA\end{vmatrix}=\begin{vmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&
简约版P站 第三方版Pixiix 干净整洁超好用
宁歪歪
经验分享
【应用名称】PixEz【应用版本】0.9.58uno【软件大小】38mb【适用型号】安卓【测试】RedmiK50【应用测评】github上大佬开发的pixiv第三方版本,采用官方图源,免代理直连,可以开启Rxx模式,无广告,界面简洁,支持下载,收藏,预览,搜索等。【官方介绍】一个支持免代理直连及查看动图的第三方Pixivflutter客户端。【注意事项】登录和注册可能需要一点点科技,进去了就不用咯
Linux & Shell
一坛剩菜
shell linux
Shell脚本基础文章目录Shell脚本基础一、Shell是什么二、Shell基本语法1.变量2.流程控制条件判断if判断case判断for循环while循环3.函数系统函数自定义函数三.shell工具grepsedawkcutreadsort四.常用命令五.零散知识六.便捷工具总结一、Shell是什么 Shell是一个命令行解释器,它能够通过接收应用程序/用户的命令,去调用操作系统内核,从而完
PostgreSQL中的分区表
MambaCloud
postgresql 数据库 database
PostgreSQL中的分区表参考:https://www.xmmup.com/pgzhongdefenqubiao.html#PG_11xin_te_xingPostgreSQL分区的意思是把逻辑上的一个大表分割成物理上的几块。分区不仅能带来访问速度的提升,关键的是,它能带来管理和维护上的方便。分区表的具体好处:某些类型的查询性能可以得到极大提升更新的性能也可以得到提升,因为表的每块的索引要比在
2025-03-01 学习记录--C/C++-PTA 7-35 有理数均值
小呀小萝卜儿
学习-C/C++ 学习 c语言
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。一、题目描述⭐️二、代码(C语言)⭐️#include//【关键】计算最大公约数(GCD)longlonggcd(longlonga,longlongb){while(b!=0){//当b不为0时循环longlongtemp=b;//临时变量存储b的值b=a%b;//计算a除以b的余数,赋值给ba=temp;//将之前存储的b的值赋值给a
解读Linux文件权限r(读权限)、w(写权限)和 x(执行权限)
Rocky
linux 运维 服务器
一、r(读权限)、w(写权限)和x(执行权限)各是多少值?Linux权限的“rwx”到底是什么意思。在脑海里快速过了一遍,r是读权限,w是写权限,x是执行权限。这三者是Linux权限的基本组成单元。Linux权限是用三位二进制数表示的,每一位分别对应r、w、x。具体是:r对应二进制位100,即十进制的4。w对应二进制位010,即十进制的2。x对应二进制位001,即十进制的1。r代表4,w代表2,x
华三查看聚合下组成员信息
Rocky
交换机 java 前端 数据库 运维
displaylink-aggregationverbosedisplaylink-aggregationverbose命令用来显示已有聚合接口所对应聚合组的详细信息。【命令】displaylink-aggregationverbose[{bridge-aggregation|route-aggregation}[interface-number]][all-configuration]【参数】b
【python】读取excel表中某列,根据此列数据来统计次数
Rocky
日积月累 Python python pandas 开发语言
这个是用来读取excel表中某列,然后根据这一列表中的数据来统计一共出现次数,将前20打印出来并保存到新表中。适合做类似统计人员迟到、事件出现次数等。注意不是求和。都是为了简化工作量,实用小小脚本。importpandasaspd#读取Excel表格文件df=pd.read_excel('001.xlsx')#统计某列内容的行数,类似算次数column_name='姓名'column_counts
用Python批处理将PDF文件转换成图片格式如PNG(工具:PyMuPDF模块)
米芽在学习
菜鸟啄米 python 办公软件
用Python批处理将WORD文件转换成PDF格式一、问题分析keywords:批处理、PDF转换PNG格式、办公自动化二、材料准备三、代码实现一、问题分析keywords:批处理、PDF转换PNG格式、办公自动化现在将PDF转换为图片格式的工具有很多,本文运用Python的PyMuPDF模块,将所给路径下的所有PDF文件,批量转换成PNG格式,并存储于指定路径中。二、材料准备1、PyMuPDF模
【菜鸟笔记|算法导论】十大排序算法总结与python实现
武咏歌
算法 排序算法
算法导论中提到了七种排序算法,再加上冒泡排序、选择排序、希尔排序,构成我们常说的十大排序算法。其中冒泡、选择、插入、希尔、归并、堆、快速排序都是比较排序算法(即通过对元素进行大小比较来确定顺序);计数、基数、桶排序都是非比较排序算法。十大排序算法的性能比较如下表:下面将简单描述十大排序算法的原理,并分别用python实现。笔记自用就不附原理图了,如果对原理有疑问请参阅算法导论那本书,里面算法运行过
20250303-代码笔记-train_n100
唐小旭
代码学习笔记 笔记
文章目录前言一、参数1.MachineEnvironmentConfig2.PathConfig3.Imports4.Parameters环境参数(`env_params`):模型参数(model_params):优化器参数(`optimizer_params`):训练器参数(trainer_params):加载预训练模型的设置(`model_load`):日志文件参数(`logger_param
费曼学习法11 - NumPy 的 “线性代数” 之力:矩阵运算与应用 (应用篇)
修昔底德
Python费曼学习法 线性代数 学习 numpy python 人工智能 深度学习
第六篇:NumPy的“线性代数”之力:矩阵运算与应用(应用篇)开篇提问:考虑一个实际问题:图像的旋转。当你使用图像编辑软件旋转照片时,背后是什么在驱动图像像素的精确移动?答案是线性代数。图像可以表示为数值矩阵,而旋转、缩放、剪切等图像变换,都可以通过矩阵运算来实现。线性代数不仅是图像处理的基石,也在机器学习、物理模拟、工程计算等众多领域扮演着核心角色。它提供了一套强大的数学工具,用于描述和解决多维
Bootstrap笔记
湖前一人对影成双
bootstrap 笔记 前端
初识Bootstrapv4.bootcss.com图标库bootstrap与...相联系编译版Bootstrap文件结构:快速开发使用Bootstrap4.4.1编译版包中包含css和js文件夹。css和js文件夹中都提供了两种类型的文件,压缩的和未压缩的的文件。bootstrap.*是预编译的文件,bootstrap.min.*是编译且压缩后的文件。bootstrap.*.map格式的文件,是s
蓝桥杯算法基础(36)动态规划dp经典问题详解
湖前一人对影成双
算法 蓝桥杯 动态规划
动态规划-动态规划方法方法代表了这一类问题(最优子结构or子问题最优性)的有一半解法,是设计方法或者策略,不是具体算法-本质是递推,核心是找到状态转移的方式,写出dp方程-形式:记忆性递归递推01背包问题有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过n的物品,求所有挑选方案中的值总和的最大值1=w[i]){intv1=v[i]+dfs(i+1,ww-w[i]);//选择当前
恶意文件检测指南:构建高效安全防御体系
ivwdcwso
安全 安全 安全分析
在当今数字化时代,恶意文件已成为网络攻击的主要载体。从勒索软件加密企业数据到APT组织投递钓鱼文档,安全工程师每天都需要在海量文件中快速识别威胁。本文将深入解析恶意文件检测的核心技术、实战工具链与高级对抗策略,助您构建多层次防御体系。©ivwdcwso(ID:u012172506)一、为什么传统杀毒软件不再够用?2023年Verizon数据泄露报告显示,32%的恶意软件成功绕过传统AV检测。新型威
蓝桥杯算法基础(35)贪心算法详解
湖前一人对影成双
蓝桥杯 算法 职场和发展
动态规划和贪心算法都是一种推导算法均用“局部最优解”来推导“全局最优解”是对遍历解空间的一种优化当问题具有最有子结构时,可用都动规,而贪心是动规的特例什么是贪心策略顾眼前-->长远-遵循某种规则,不断(贪心地)选取当前最优策略,最终找到最优解-难点:当前最优未必是整体最优贪心策略例1:硬币支付问题有1元,5元,10元,50元,100元,500元地硬币各c1,c5,c10,c50,c100,c500
使用Docker搭建本地Nexus私有仓库
txzq
JAVA 基础 docker maven java
0-1开始Java语言编程之路一、Ubuntu下Java语言环境搭建二、Ubuntu下Docker环境安装三、使用Docker搭建本地NexusMaven私有仓库四、Ubuntu下使用VisualStudioCode进行Java开发你需要NexusJava应用编译构建的一种主流方式就是通过Maven,Maven可以很方便的管理Java应用的各种依赖包。但是在默认情况下,maven在进行java应用
研发管理之-多元文化研发团队公约
txzq
IT研发管理 研发管理
如果你工作在一个多元文化的团队,团队成员来自不同的地区,那么为了营造一个好的团队氛围,我们需要一个团队公约:沟通(Communication)及时性(Timeliness):尊重不同的时区和工作时间,及时回应团队的各种消息和需求。清晰性(Clarity):沟通时保持简明,使用合适的渠道(即时消息、电子邮件、视频会议等)进行准确的信息传达。包容性(Inclusivity):保证在讨论、决策和会议中让
shell案例系列3-将多个文件写入到同一个文件
只是甲
Linux csv导入 数据库同步 正则筛选 awk命令 批量处理
文章目录一.需求二.解决方案一.需求今天遇到一个问题,应用程序将每天的数据都导出成一个单独的csv,现在需要将这些文件导入到数据库中。示例:callid_20210101.csvcallid_20210102.csvcallid_20210103.csv......callid_20211231.csv二.解决方案首先我们要将所有的csv的数据都汇总到一个csv文件,然后将csv文件的数据同步到数
python中函数的应用
sky__man
summary 函数 def
一.函数1.定义函数def函数名称(参数):#此参数为形参,不是真实存在的函数需要执行的代码块return函数返回值1,函数返回值2#如果函数中没有return,默认返回None,多个返回值实质是一个元组2.调用函数函数名称(参数)#此参数为实参print函数名称(参数)#此参数为实参var=函数名称(参数)#此参数为实参,当函数有返回值时,可以赋值给一个变量eg:
(undone) MIT6.S081 2023 xv6 番外:用户态程序是如何被编译进磁盘,并被 xv6 加载的?fs.img 如何生成?
shimly123456
MIT6.S081 学习笔记 操作系统
以ls命令为例,它是用户态程序,那么自然不会在操作系统启动过程中被加载到内存,而是存放在磁盘上等着用户要求加载它们。那么可以想见的是,对于xv6来说,它们应该是被加载编译进fs.img里。我们来看看fs.img是如何生成的。首先看Makefile:263,如下,是fs.img的依赖和生成命令fs.img:mkfs/mkfsREADME$(UEXTRA)$(UPROGS)mkfs/mkfsfs.im
TCP是如何保证可靠性的
干净的坏蛋
网络 tcp/ip 网络 网络协议
TCP(传输控制协议)是一种可靠的面向连接的协议,它通过以下几种方式来保证数据的可靠传输:1、确认和重传机制:当接收方收到数据后,会发送一个确认消息给发送方,告诉它已经收到数据。如果发送方没有收到确认消息,它会重传数据,直到接收方收到数据并发送确认消息。2、序列号和确认号:TCP将每个数据段都分配一个序列号和确认号,序列号用于标识数据段的位置,确认号用于确认已经收到的数据段的位置,这样可以避免数据
Vistual Studio中x86和x64的区别
*Major*
VistualStudio中x86和x64的区别VistualStudio中x86和x64的区别VistualStudio中x86和x64的区别一首先声明一下“windowsx64和x86有啥区别”这个问题和“windows64和32有啥区别”是一样的,因为x64其实就是64位,x86其实就是32位,在口语中我们说32位会多于x86二区别系统x86与x64的区别:1、内存寻址能力区别32位系统寻址
C语言数组初始化的垃圾值问题——以一维数组打印杨辉三角为例
难过先生
算法相关 c语言 算法 数据结构
问题场景:利用一维数组打印杨辉三角代码逻辑杨辉三角的性质:杨辉三角中的每个元素等于其左上方和正上方两个元素之和。对于第一列(j=0)和最后一列(j=i),其值恒为1。代码实现的关键点:使用一个一维数组tmp来存储当前行的数据。每次计算新一行时,通过变量l和r分别保存左上和正上的值。由于tmp数组的初始值被正确初始化为0(除了第一个元素为1),确保了计算过程不会受到垃圾值的影响。问题描述初试代码如下
python 浅谈fstring以及简单的使用。
qq_24499417
Python python fstring 3.6 格式化 新特性
今天看了一下python3.6中的fstring格式化,还是蛮方便的。字符串前面需要带上f标记,变量名直接用在字符串里面,需带上{}以与普通的字符串区分:要想使{}只作为单纯的{}而没有格式化的特殊意义,可以double一次就可以只代表本身了。如下图,这样{}也出现在里面了,但是格式化也失败了。要是想要将名字显示在{}里面。我们需要先把name放在{}里面,然后外面再套上一层{},但因为外层的{}
Python中常用的100个函数,涵括小白到资深码农!
马大哈(Python)
python 开发语言 算法
1.print():打印输出内容到控制台。2.input():接收用户输入。3.len():返回对象的长度。4.type():返回对象的类型。5.int():将字符串或其他类型转换为整数。6.float():将字符串或其他类型转换为浮点数。7.str():将对象转换为字符串。8.list():创建一个列表。9.tuple():创建一个元组。10.dict():创建一个字典。11.set():创建一
多线程编程之join()方法
周凡杨
java JOIN 多线程 编程 线程
现实生活中,有些工作是需要团队中成员依次完成的,这就涉及到了一个顺序问题。现在有T1、T2、T3三个工人,如何保证T2在T1执行完后执行,T3在T2执行完后执行?问题分析:首先问题中有三个实体,T1、T2、T3, 因为是多线程编程,所以都要设计成线程类。关键是怎么保证线程能依次执行完呢?
Java实现过程如下:
public class T1 implements Runnabl
java中switch的使用
bingyingao
java enum break continue
java中的switch仅支持case条件仅支持int、enum两种类型。
用enum的时候,不能直接写下列形式。
switch (timeType) {
case ProdtransTimeTypeEnum.DAILY:
break;
default:
br
hive having count 不能去重
daizj
hive 去重 having count 计数
hive在使用having count()是,不支持去重计数
hive (default)> select imei from t_test_phonenum where ds=20150701 group by imei having count(distinct phone_num)>1 limit 10;
FAILED: SemanticExcep
WebSphere对JSP的缓存
周凡杨
WAS JSP 缓存
对于线网上的工程,更新JSP到WebSphere后,有时会出现修改的jsp没有起作用,特别是改变了某jsp的样式后,在页面中没看到效果,这主要就是由于websphere中缓存的缘故,这就要清除WebSphere中jsp缓存。要清除WebSphere中JSP的缓存,就要找到WAS安装后的根目录。
现服务
设计模式总结
朱辉辉33
java 设计模式
1.工厂模式
1.1 工厂方法模式 (由一个工厂类管理构造方法)
1.1.1普通工厂模式(一个工厂类中只有一个方法)
1.1.2多工厂模式(一个工厂类中有多个方法)
1.1.3静态工厂模式(将工厂类中的方法变成静态方法)
&n
实例:供应商管理报表需求调研报告
老A不折腾
finereport 报表系统 报表软件 信息化选型
引言
随着企业集团的生产规模扩张,为支撑全球供应链管理,对于供应商的管理和采购过程的监控已经不局限于简单的交付以及价格的管理,目前采购及供应商管理各个环节的操作分别在不同的系统下进行,而各个数据源都独立存在,无法提供统一的数据支持;因此,为了实现对于数据分析以提供采购决策,建立报表体系成为必须。 业务目标
1、通过报表为采购决策提供数据分析与支撑
2、对供应商进行综合评估以及管理,合理管理和
mysql
林鹤霄
转载源:http://blog.sina.com.cn/s/blog_4f925fc30100rx5l.html
mysql -uroot -p
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
[root@centos var]# service mysql
Linux下多线程堆栈查看工具(pstree、ps、pstack)
aigo
linux
原文:http://blog.csdn.net/yfkiss/article/details/6729364
1. pstree
pstree以树结构显示进程$ pstree -p work | grep adsshd(22669)---bash(22670)---ad_preprocess(4551)-+-{ad_preprocess}(4552) &n
html input与textarea 值改变事件
alxw4616
JavaScript
// 文本输入框(input) 文本域(textarea)值改变事件
// onpropertychange(IE) oninput(w3c)
$('input,textarea').on('propertychange input', function(event) {
console.log($(this).val())
});
String类的基本用法
百合不是茶
String
字符串的用法;
// 根据字节数组创建字符串
byte[] by = { 'a', 'b', 'c', 'd' };
String newByteString = new String(by);
1,length() 获取字符串的长度
&nbs
JDK1.5 Semaphore实例
bijian1013
java thread java多线程 Semaphore
Semaphore类
一个计数信号量。从概念上讲,信号量维护了一个许可集合。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。
S
使用GZip来压缩传输量
bijian1013
java GZip
启动GZip压缩要用到一个开源的Filter:PJL Compressing Filter。这个Filter自1.5.0开始该工程开始构建于JDK5.0,因此在JDK1.4环境下只能使用1.4.6。
PJL Compressi
【Java范型三】Java范型详解之范型类型通配符
bit1129
java
定义如下一个简单的范型类,
package com.tom.lang.generics;
public class Generics<T> {
private T value;
public Generics(T value) {
this.value = value;
}
}
【Hadoop十二】HDFS常用命令
bit1129
hadoop
1. 修改日志文件查看器
hdfs oev -i edits_0000000000000000081-0000000000000000089 -o edits.xml
cat edits.xml
修改日志文件转储为xml格式的edits.xml文件,其中每条RECORD就是一个操作事务日志
2. fsimage查看HDFS中的块信息等
&nb
怎样区别nginx中rewrite时break和last
ronin47
在使用nginx配置rewrite中经常会遇到有的地方用last并不能工作,换成break就可以,其中的原理是对于根目录的理解有所区别,按我的测试结果大致是这样的。
location /
{
proxy_pass http://test;
java-21.中兴面试题 输入两个整数 n 和 m ,从数列 1 , 2 , 3.......n 中随意取几个数 , 使其和等于 m
bylijinnan
java
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class CombinationToSum {
/*
第21 题
2010 年中兴面试题
编程求解:
输入两个整数 n 和 m ,从数列 1 , 2 , 3.......n 中随意取几个数 ,
使其和等
eclipse svn 帐号密码修改问题
开窍的石头
eclipse SVN svn帐号密码修改
问题描述:
Eclipse的SVN插件Subclipse做得很好,在svn操作方面提供了很强大丰富的功能。但到目前为止,该插件对svn用户的概念极为淡薄,不但不能方便地切换用户,而且一旦用户的帐号、密码保存之后,就无法再变更了。
解决思路:
删除subclipse记录的帐号、密码信息,重新输入
[电子商务]传统商务活动与互联网的结合
comsci
电子商务
某一个传统名牌产品,过去销售的地点就在某些特定的地区和阶层,现在进入互联网之后,用户的数量群突然扩大了无数倍,但是,这种产品潜在的劣势也被放大了无数倍,这种销售利润与经营风险同步放大的效应,在最近几年将会频繁出现。。。。
如何避免销售量和利润率增加的
java 解析 properties-使用 Properties-可以指定配置文件路径
cuityang
java properties
#mq
xdr.mq.url=tcp://192.168.100.15:61618;
import java.io.IOException;
import java.util.Properties;
public class Test {
String conf = "log4j.properties";
private static final
Java核心问题集锦
darrenzhu
java 基础 核心 难点
注意,这里的参考文章基本来自Effective Java和jdk源码
1)ConcurrentModificationException
当你用for each遍历一个list时,如果你在循环主体代码中修改list中的元素,将会得到这个Exception,解决的办法是:
1)用listIterator, 它支持在遍历的过程中修改元素,
2)不用listIterator, new一个
1分钟学会Markdown语法
dcj3sjt126com
markdown
markdown 简明语法 基本符号
*,-,+ 3个符号效果都一样,这3个符号被称为 Markdown符号
空白行表示另起一个段落
`是表示inline代码,tab是用来标记 代码段,分别对应html的code,pre标签
换行
单一段落( <p>) 用一个空白行
连续两个空格 会变成一个 <br>
连续3个符号,然后是空行
Gson使用二(GsonBuilder)
eksliang
json gson GsonBuilder
转载请出自出处:http://eksliang.iteye.com/blog/2175473 一.概述
GsonBuilder用来定制java跟json之间的转换格式
二.基本使用
实体测试类:
温馨提示:默认情况下@Expose注解是不起作用的,除非你用GsonBuilder创建Gson的时候调用了GsonBuilder.excludeField
报ClassNotFoundException: Didn't find class "...Activity" on path: DexPathList
gundumw100
android
有一个工程,本来运行是正常的,我想把它移植到另一台PC上,结果报:
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mobovip.bgr/com.mobovip.bgr.MainActivity}: java.lang.ClassNotFoundException: Didn't f
JavaWeb之JSP指令
ihuning
javaweb
要点
JSP指令简介
page指令
include指令
JSP指令简介
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。
JSP指令的基本语法格式:
<%@ 指令 属性名="
mac上编译FFmpeg跑ios
啸笑天
ffmpeg
1、下载文件:https://github.com/libav/gas-preprocessor, 复制gas-preprocessor.pl到/usr/local/bin/下, 修改文件权限:chmod 777 /usr/local/bin/gas-preprocessor.pl
2、安装yasm-1.2.0
curl http://www.tortall.net/projects/yasm
sql mysql oracle中字符串连接
macroli
oracle sql mysql SQL Server
有的时候,我们有需要将由不同栏位获得的资料串连在一起。每一种资料库都有提供方法来达到这个目的:
MySQL: CONCAT()
Oracle: CONCAT(), ||
SQL Server: +
CONCAT() 的语法如下:
Mysql 中 CONCAT(字串1, 字串2, 字串3, ...): 将字串1、字串2、字串3,等字串连在一起。
请注意,Oracle的CON
Git fatal: unab SSL certificate problem: unable to get local issuer ce rtificate
qiaolevip
学习永无止境 每天进步一点点 git 纵观千象
// 报错如下:
$ git pull origin master
fatal: unable to access 'https://git.xxx.com/': SSL certificate problem: unable to get local issuer ce
rtificate
// 原因:
由于git最新版默认使用ssl安全验证,但是我们是使用的git未设
windows命令行设置wifi
surfingll
windows wifi 笔记本wifi
还没有讨厌无线wifi的无尽广告么,还在耐心等待它慢慢启动么
教你命令行设置 笔记本电脑wifi:
1、开启wifi命令
netsh wlan set hostednetwork mode=allow ssid=surf8 key=bb123456
netsh wlan start hostednetwork
pause
其中pause是等待输入,可以去掉
2、
Linux(Ubuntu)下安装sysv-rc-conf
wmlJava
linux ubuntu sysv-rc-conf
安装:sudo apt-get install sysv-rc-conf 使用:sudo sysv-rc-conf
操作界面十分简洁,你可以用鼠标点击,也可以用键盘方向键定位,用空格键选择,用Ctrl+N翻下一页,用Ctrl+P翻上一页,用Q退出。
背景知识
sysv-rc-conf是一个强大的服务管理程序,群众的意见是sysv-rc-conf比chkconf
svn切换环境,重发布应用多了javaee标签前缀
zengshaotao
javaee
更换了开发环境,从杭州,改变到了上海。svn的地址肯定要切换的,切换之前需要将原svn自带的.svn文件信息删除,可手动删除,也可通过废弃原来的svn位置提示删除.svn时删除。
然后就是按照最新的svn地址和规范建立相关的目录信息,再将原来的纯代码信息上传到新的环境。然后再重新检出,这样每次修改后就可以看到哪些文件被修改过,这对于增量发布的规范特别有用。
检出