精华内容
下载资源
问答
  • 序本文主要介绍如何使用java对list进行遍历,...需求有一个student list集合,包含学号,身高,体重,需要遍历list,计算出BMI值,并将其转换成 学号 -> student 的map集合。Student.javaclass Student{private ...

    本文主要介绍如何使用java对list进行遍历,并将list转换成map。主要涉及jdk8的stream操作和guava工具包操作集合,并涉及到guava工具包的实现说明。

    需求

    有一个student list集合,包含学号,身高,体重,需要遍历list,计算出BMI值,并将其转换成 学号 -> student 的map集合。

    Student.java

    class Student{

    private int id;

    private float weight;

    private float height;

    private float IMB;

    }

    计算IMB值

    Private Student calIMB(Student stu){

    int imb = stu.getWeight() / (stu.getHeight() * stu.getHeight());

    return stu.setIMB(imb);

    }

    jdk8 流式操作

    流式操作的代码非常简洁,一行代码即可搞定。

    List studentList;

    Map resultMap = studentList.stream().

    map(stu -> calIMB(stu)).

    collection(Collectors.toMap(stu::getId,stu -> stu,(s1,s2)-> s1));

    Stream.map() 集合内的所有元素会被当成入参,运行一次入参方法。

    Collectors.toMap(stu::getId,stu -> stu,(s1,s2)-> s1) 第一个参数是返回key,第二个参数是map对应的值,第三个参数为如果key重复时,选择哪个作为map的value。

    guava 工具类 Lists Maps

    在工作中会遇到java7或者更低版本的环境,无法使用stream流,但是for循环又太繁琐,可读性又差,这时候可以尝试使用google的guava工具包,guava提供了便捷的集合操作工具类,来看看如何实现这个需求呢。

    List studentList;

    studentList = Lists.transform(studentList, new Function() {

    @Nullable @Override public Student apply(@Nullable Student stu) {

    return calIMB(stu);

    }

    }); //计算IMB值

    Map resultMap = Maps.uniqueIndex(studentList, new Function() {

    @Nullable @Override public Integer apply(@Nullable Student input) {

    return input.getId();

    }

    }); //list转map

    利用Lists.transform对list进行封装,使每个元素获取时都会执行第二个参数自定义function。再用Maps.uniqueIndex()将list转换成map,function的返回值就是map的key。

    此处需要注意的是,Lists.transform并不会执行function,返回的只是guava封装的TransformingRandomAccessList或TransformingSequentialList,在调用get或者Iterator获取元素时,才会对获取的元素执行function方法。

    Lists.transform 源码

    下面看一下Lists.transform做了些什么

    public static List transform(

    List fromList, Function super F, ? extends T> function) {

    return (fromList instanceof RandomAccess)

    ? new TransformingRandomAccessList(fromList, function)

    : new TransformingSequentialList(fromList, function);

    }

    先判断list是否继承RandomAccess接口,RandomAccess是一个声明式接口,继承RandomAccess代表支持非顺序的获取元素,比如ArrayList就继承该接口,ArrayList.get(i)可以直接获取到第i个元素,而链表就需要i次迭代才可获取到数据。按RandomAccess的文档说明,for循环直接get元素进行迭代要比迭代器的操作更快一些,这点令我无法理解,理论上ArrayList的迭代耗时应该基本一致才对,也不知道有什么形式的列表满足这一含义。

    下面以TransformingRandomAccessList为例来看后续实现:

    private static class TransformingRandomAccessList

    extends AbstractList implements RandomAccess, Serializable {

    final List fromList;

    final Function super F, ? extends T> function;

    TransformingRandomAccessList(

    List fromList, Function super F, ? extends T> function) {

    this.fromList = checkNotNull(fromList);

    this.function = checkNotNull(function);

    }

    @Override public void clear() {

    fromList.clear();

    }

    @Override public T get(int index) {

    return function.apply(fromList.get(index));

    }

    @Override public Iterator iterator() {

    return listIterator();

    }

    @Override public ListIterator listIterator(int index) {

    return new TransformedListIterator(fromList.listIterator(index)) {

    @Override

    T transform(F from) {

    return function.apply(from);

    }

    };

    }

    ...

    }

    TransformingRandomAccessList的构造方法只记录了list和function,并未进行其他操作,在调用get()方法或迭代器获取元素时,会调用function.apply()方法,多次获取同一个元素,自定义function会被重复调用多次。

    那么guava包内是否有方法可以类似stream流进行转换的时候就执行function获取结果,而不是获取元素时再执行的方法呢?

    FluentIterable

    FluentIterable 是guava集合类中常用的一个类,主要用于过滤、转换集合中的数据,它的使用更像是stream流:

    List studentList;

    Map resultMap = FluentIterable.from(studentList).transform(new Function() {

    @Nullable @Override public Student apply(@Nullable Student input) {

    return calIMB(input);

    }

    }).uniqueIndex(studentList, new Function() {

    @Nullable @Override public Integer apply(@Nullable Student input) {

    return input.getId();

    }

    });

    和Lists、Maps工具类不同的是,每次transform操作都会对集合进行迭代,执行function,并将迭代后的Iterable通过from再次转换成FluentIterable,用以支持链式调用,看起来很像套娃,用起来也非常简洁。

    小结

    迭代集合进行转换操作,jdk8及以上版本用stream和lambda写起来轻松愉快。

    如果是低版本的,则可以考虑使用FluentIterable,代码也非常工整。

    若转换操作非常耗时,不会重复获取某个元素,并且只会使用集合的部分数据,使用Lists.transform进行转换也有助于性能提升。

    展开全文
  • Java 8遍历ListMap语法

    2020-03-25 00:09:26
    java 8中的语法遍历listmap还有比较简单的语法,其实还是比较好理解的,有的时候可以使用这些方法来简化代码,例子如下: import java.util.ArrayList; import java.util.HashMap; import java.util.List; ...

    在java 8中遍历list与map还有比较简单的语法,其实还是比较好理解的,有的时候可以使用这些方法来简化代码,例子如下:

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    public class Main {
        public static void main(String[] args) {
            Map<String, String> map = new HashMap<>();
            List<String> list = new ArrayList<>();
            /*java 8的lamda语法*/
            map.put("zhangsan", "12");
            map.put("lisi", "13");
            map.put("wangwu", "14");
            list.add("wangwu");
            list.add("zhaoliu");
            map.forEach((k, v)->{
                System.out.println(k + " " + v);
            });
            list.forEach(li->{
                System.out.println(li);
            });
        }
    }

     

    展开全文
  • 通过表达式遍历List<Map<String,Object>> /** * <h1>根据分页参数,更新梦境阅读量</h1> */ private void getReadByPageSize(List<Map<String, Object>> maps){ if(maps....

    通过表达式遍历List<Map<String,Object>>

    
     /**
         * <h1>根据分页参数,更新梦境阅读量</h1>
         */
        private void  getReadByPageSize(List<Map<String, Object>> maps){
            if(maps.size()>0){
                maps.stream()
                        .forEach(stringObjectMap->
                                stringObjectMap.forEach((key,val)->
                                        //dreamId
                                        System.out.println("name: "+key+" "+"value:"+val)));
            }
        }
    
    

    只获取某一个数据,进行过滤获取

    		System.out.println("只取sex为0****************");
    		List<Demo> demorm = demos.stream().filter(demo -> demo.getSex() == 0).distinct().collect(Collectors.toList());
    		demorm.forEach(demo -> {
    			System.out.println("年龄 " + demo.getAge() + "  性别 " + demo.getSex() + ",");
    		});
    
    展开全文
  • Java8遍历MapMapListListMap

    千次阅读 2020-05-27 19:53:00
    遍历Map Map<Integer, String> map = new HashMap<>(); map.put(1, "a"); map.put(2, "b"); map.put(3, "c"); // Map.keySet遍历 for (Integer k : map.keySet()) { System.out.println(k + " ==>....

    遍历Map

    Map<Integer, String> map = new HashMap<>();
    map.put(1, "a");
    map.put(2, "b");
    map.put(3, "c");
    
    // Map.keySet遍历
    for (Integer k : map.keySet()) {
    	System.out.println(k + " ==> " + map.get(k));
    }
    
    map.keySet().forEach(k -> System.out.println(k + " ==> " + map.get(k)));
    
    // Map.entrySet遍历,推荐大容量时使用
    for (Map.Entry<Integer, String> entry : map.entrySet()) {
    	System.out.println(entry.getKey() + " ==> " + entry.getValue());
    }
    
    map.entrySet().forEach(entry -> System.out.println(entry.getKey() + " ==> " + entry.getValue()));
    
    // Iterator遍历
    Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
    while (it.hasNext()) {
    	Map.Entry<Integer, String> entry = it.next();
    	System.out.println(entry.getKey() + " ==> " + entry.getValue());
    }
    
    map.entrySet().iterator()
    		.forEachRemaining(entry -> System.out.println(entry.getKey() + " ==> " + entry.getValue()));
    
    // 遍历values
    for (String v : map.values()) {
    	System.out.println(v);
    }
    map.values().forEach(System.out::println);
    
    // Java8 Lambda
    map.forEach((k, v) -> System.out.println(k + " ==> " + v));
    

    Map转List

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    class KeyValue {
    	private Integer key;
    	private String value;
    
    	@Override
    	public String toString() {
    		return key + " ==> " + value;
    	}
    
    }
    
    Map<Integer, String> map = new HashMap<>();
    map.put(1, "a");
    map.put(2, "b");
    map.put(3, "c");
    
    // key 转 List
    List<Integer> keyList = new ArrayList<>(map.keySet());
    List<Integer> keyList2 = map.keySet().stream().collect(Collectors.toList());
    
    keyList.forEach(System.out::println);
    keyList2.forEach(System.out::println);
    
    // value 转 List
    List<String> valueList = new ArrayList<>(map.values());
    List<String> valueList2 = map.values().stream().collect(Collectors.toList());
    
    valueList.forEach(System.out::println);
    valueList2.forEach(System.out::println);
    
    // Iterator转List
    List<KeyValue> keyValueList = new ArrayList<>();
    Iterator<Integer> it = map.keySet().iterator();
    while (it.hasNext()) {
    	Integer k = (Integer) it.next();
    	keyValueList.add(new KeyValue(k, map.get(k)));
    }
    
    keyValueList.forEach(System.out::println);
    
    // Java8 Stream
    List<KeyValue> list = map.entrySet().stream().map(c -> new KeyValue(c.getKey(), c.getValue()))
    		.collect(Collectors.toList());
    list.forEach(System.out::println);
    

    List转Map

    List<KeyValue> list = new ArrayList<>();
    list.add(new KeyValue(1, "a"));
    list.add(new KeyValue(2, "b"));
    list.add(new KeyValue(3, "c"));
    
    // 遍历
    Map<Integer, String> keyValueMap = new HashMap<>();
    for (KeyValue keyValue : list) {
    	keyValueMap.put(keyValue.getKey(), keyValue.getValue());
    }
    keyValueMap.forEach((k, v) -> System.out.println(k + " ==> " + v));
    
    // Java8 Stream
    Map<Integer, String> map = list.stream().collect(Collectors.toMap(KeyValue::getKey, KeyValue::getValue));
    map.forEach((k, v) -> System.out.println(k + " ==> " + v));
    
    展开全文
  • 使用JDK8新特性,for循环增强,Iterator,while做遍历List集合public static void main(String[] args) {List list = new ArrayList<>();list.add("test1x");list.add("test2x");list.add("test3x");System....
  • java8实现map遍历maplistlistmap

    万次阅读 2019-06-12 10:59:05
    遍历map map.forEach((k, v) -> System.out.println("key:value = " + k + ":" + v)); maplist map.entrySet().stream().map(e -> new Person(e.getKey(),e.getValue())).collect(Collectors....
  • java8 遍历list集合

    千次阅读 2019-06-26 22:13:31
    java中的集合有两种形式Collection<E>,Map<K,V> Collection类型集合 在JAVA7中遍历有一下几种方式: Lis...
  • Java8 forEach遍历List< Map> 数据

    千次阅读 2020-04-23 22:54:06
    Java8 Stream.forEach输出List<Map<String, Object>>数据 1.forEach遍历Map 示例 下面示例是一个数据库查询返回一个List<Map<String, Object>>类型数据,使用java8的forEach遍历输出结果。...
  • public void query() { UserDao userDao = new UserDao(); ColumnHolder sqlColumn = ColumnHolder.of() .addColumn("id","1") .addColumn("passwd",... List<Map<String, Object>> result = ...
  • java8 list Map遍历

    2020-06-18 14:06:50
    最近在写java8 stream遍历,发现拿到泛型为map的比较麻烦,研究了好久,直接 上代码 listMap.stream().forEach(map -> { Set<Map.Entry<String, String>> set = map.entrySet(); ...
  • java8 stream 流遍历 List分组Map

    千次阅读 2019-02-27 16:01:03
    List&lt;Map&lt;String,Object&gt;&gt; lsl = new ArrayList&lt;&gt;(); Map&lt;String,Object&gt; map = new HashMap&lt;&gt;(); map.put("id", &...
  • java8 新增的遍历ListMap的方法

    千次阅读 2018-06-06 16:18:28
    @Test public void test() { String str = "asdfghjkl"; List&lt;String&gt; lis = Arrays.asList(str.split("... // java8操作list lis.stream().filter(s1 -&gt; !s1.equa...
  • 最近写在基于Spring WebFlux项目遇到一个需求,希望将请求中的cookie/headers/params等信息获取,而获取后的数据结构都是MultiValueMap&...的数据结构,实质上可以看做是Map<K, List<V>>这种数据结构。...
  • java8 ListMap遍历

    千次阅读 2017-08-16 23:14:21
    java简化了foreach遍历。可以将list和mapzhuan转化为stream来操作 List items = new ArrayList(); items.add("A"); items.add("B"); items.add("C"); items.add("D"); items.add("E"); items.forEach(item->System...
  • 第一遍历Map集合以往会使用增强for语法来遍历如:public static void main(String[] args) {Map items = new HashMap<>();items.put("A", 10);items.put("B", 20);items.put("C", 30);items.put("D", 40);...
  • Java8 List Map 集合遍历

    千次阅读 2018-11-29 11:47:13
    //排序list: List&amp;amp;lt;String&amp;amp;gt; list = Arrays.asList(&amp;quot;a&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;A&amp;...//遍历list: List&
  • 第一遍历Map集合 以往会使用增强for语法来遍历如: public static void main(String[] args) { Map<String, Integer> items = new HashMap<>(); items.put("A", 10); items.put("B", 20); items.put...
  • jdk8 遍历List<Map>

    千次阅读 2018-08-31 12:51:21
    package ... import static java.util.stream.Collectors.toList; import java.util.ArrayList; import java.util.HashMap; import java.util.List;...import java.util.Map; /** * 测试类 * @autho...
  • 使用forEach函数进行遍历 List集合中元素为对象<User>类型 Map集合中元素为<String,Student>类型 这个元素类型就可以根据自己的需要去设定了 需求:想要将两个集合中的元素合并到同一个集合中,并且两个...
  • Java 8 之 forEach遍历MapList简单例子

    千次阅读 2018-11-26 15:22:50
    1.forEach and Map ...普通遍历Map 的方法: public static void main(String[] args) { Map<String, Integer> items = new HashMap<>(); items.put("A", 10); items.put("B", 20); ...
  • java中的集合有两种形式Collection,MapCollection类型集合在JAVA7中遍历有一下几种方式:List list = Arrays.asList("aaaa","bbbb");//for循环for (int i=0;i< list.size();i++){System.out.println(list.get(i)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 402
精华内容 160
关键字:

java8遍历listmap

java 订阅