public static Stream<MediaType> parseList(String mediaTypeList) {
      if (mediaTypeList == null || mediaTypeList.isEmpty()) throw CONTAINER.missingMediaType();

      Matcher matcher = TREE_PATTERN.matcher(mediaTypeList);
      List<MediaType> list = new ArrayList<>();
      while (true) {
         MediaType mediaType = parseSingleMediaType(mediaTypeList, matcher, true);
         list.add(mediaType);

         if (matcher.end() == mediaTypeList.length())
            break;

         matcher.region(matcher.end(), mediaTypeList.length());
      }

      list.sort(Comparator.comparingDouble(MediaType::getWeight).reversed());
      return list.stream();
   }
@Test
   public void testParseList() {
      List<MediaType> mediaTypes = MediaType.parseList("text/html, image/png,*/*").collect(Collectors.toList());
      assertEquals(asList(MediaType.TEXT_HTML, MediaType.IMAGE_PNG, MediaType.MATCH_ALL), mediaTypes);

      Exceptions.expectException(EncodingException.class, () -> MediaType.parseList("text/html,"));
      Exceptions.expectException(EncodingException.class, () -> MediaType.parseList("text/html;a=b,"));
      Exceptions.expectException(EncodingException.class, () -> MediaType.parseList("text/html;a=b,;b=c"));
      Exceptions.expectException(EncodingException.class, () -> MediaType.parseList("text/html;a=b,image/png/"));

      List<MediaType> mediaTypes2 = MediaType.parseList("text/html;a=\"b,\" ,*/*").collect(Collectors.toList());
      assertEquals(asList(MediaType.TEXT_HTML.withParameter("a", "\"b,\""), MediaType.MATCH_ALL), mediaTypes2);
   }