biafas
biafas

Reputation: 137

ArrayIndexOutOfBounds, while using Java 8 streams to iterate a list

I have a List of Objects called md. Each of this objects has an activityName, a startTime and an endTime(for the activity). I want to iterate over this list and for each activity, get the startTime and endTime.

Map<String,Long> m1 = new HashMap<String,Long>();
        m1 = md
                .stream()
                .map(s->s.activityName)
                .collect(HashMap<String,Long>::new,
                    (map,string)->{
                        String d1 = md.get(md.indexOf(string)).startTime;
                        String d2 = md.get(md.indexOf(string)).endTime;
                           .
                           .
                           .
                 },HashMap<String,Long>::putAll);

It gives me java.lang.ArrayIndexOutOfBoundsException: -1 when I try to get the index of string String d1 = md.get(md.indexOf(string)).startTime;

Is there any other way to simplify the code using Lambda expressions?

What if I have two activities with the same name (Drinking for ex).Will it only return the index of the first Drinking activity it finds?

Upvotes: 2

Views: 1106

Answers (1)

Eugene
Eugene

Reputation: 120848

It seems that you are missing that fact that once you do:

md.stream().map(s -> s.activityName)

your Stream has become Stream<String>; while your md is still List<YourObject>

And in the map operation you are trying to find a String inside md, this obviously does not exist, thus a -1.

So you need a Map<String, Long> that is activitaName -> duration it takes(could be Date/Long)

 md.stream()
   .collect(Collectors.toMap(s -> s.activityName, x -> {
       Date start = // parse s.startTime
       Date end = // parse s.endTime
       return end.minus(start);
    }));

Now the parsing depends on the dates you use.

Upvotes: 2

Related Questions